如何调整原生Date的toISOString输出以匹配moment.js的format方法输出
原生Date实现匹配moment.js format()默认输出的方案
差异根因
两个输出不一致的核心是两套API的默认规则不同:
moment(foo).format()默认输出对应时区的时间+时区偏移后缀,无毫秒位,示例中为东二区(UTC+2)的时间new Date(foo).toISOString()固定输出UTC 0时区的时间,自带3位毫秒位和UTC标识Z
原生实现代码
直接封装通用格式化函数即可实现完全匹配的输出:
function formatAsMomentDefault(input) { const date = new Date(input); // 处理时区偏移 const tzOffset = date.getTimezoneOffset(); const tzSign = tzOffset > 0 ? '-' : '+'; const tzHours = String(Math.floor(Math.abs(tzOffset)/60)).padStart(2, '0'); const tzMinutes = String(Math.abs(tzOffset)%60).padStart(2, '0'); const tzSuffix = `${tzSign}${tzHours}:${tzMinutes}`; // 拼接本地时间各字段 return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2,'0')}-${String(date.getDate()).padStart(2,'0')}T${String(date.getHours()).padStart(2,'0')}:${String(date.getMinutes()).padStart(2,'0')}:${String(date.getSeconds()).padStart(2,'0')}${tzSuffix}`; }
使用示例
调用代码:console.log(formatAsMomentDefault(foo))
输出结果与moment输出完全一致:2021-10-11T00:00:00+02:00
自定义时区说明
如果你需要固定输出某个指定时区(比如示例中的东二区),不跟随运行环境的时区变动,可以替换时区计算逻辑,手动写死时区偏移即可,无需使用getTimezoneOffset()读取当前环境偏移。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

