MomentJS:为什么format()和toISOString()产生不同的结果?

时间:2015-12-31 09:36:14

标签: javascript datetime timezone momentjs

根据文档,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"

为什么会这样,并且这些字符串在所有计算环境中完全等效?

1 个答案:

答案 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()