根据文档,moment
方法toISOString()
和format()
都生成根据ISO 8601格式化的字符串。但是,任一方法生成的字符串都不同。例如:
moment("2015-12-31T10:28:41+01:00").toISOString()
产量
"2015-12-31T09:28:41.000Z"
,而
moment("2015-12-31T10:28:41+01:00").format()
产量
"2015-12-31T10:28:41+01:00"
为什么会这样,并且这些字符串在所有计算环境中完全等效?
答案 0 :(得分:2)
toISOString
函数模仿Date
对象的toISOString
函数,因为它在格式化之前将所有值转换为UTC,然后使用Z
字符表示UTC。
format
功能本身不进行任何转换。它依赖于moment
对象所处的任何状态来确定要使用的时区偏移量。
format
函数还接受控制字符串表示的参数。如果没有传递参数,则默认为ISO8601扩展格式,带偏移量。
从实际角度来看,请注意format
在UTC模式下调用时会使用+00:00
,而不是Z
使用的toISOString
。 ISO8601允许这两种情况,但Z
特别指示UTC,而+00:00
也可能来自恰好恰好与GMT对齐的时区。例如,英国冬季使用+00:00
,夏季使用+01:00
。
同时认识到ISO8601涵盖了许多不同的格式,包括:
YYYYMMDDTHHMMSSZ
YYYY-MM-DDTHH:MM:SSZ
值得注意的是,RFC3339将此限制为扩展时间戳格式,不允许无时区形式,并允许与ISO8601稍微偏离。
.format()
和.toISOString()
都符合RFC3339。
哦,你的例子稍微偏了。如果本地时区恰好匹配,则moment("2015-12-31T10:28:41+01:00").format()
只会产生"2015-12-31T10:28:41+01:00"
。否则,该值将转换为本地时区,显示该区域的相关偏移量。如果要保持输入偏移而不考虑本地时区,请使用:
moment.parseZone("2015-12-31T10:28:41+01:00").format()