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

MomentJS: Why do format() and toISOString() yield different results?

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

为什么会这样,这些字符串在所有计算环境中是否完全等价?

toISOString 函数模仿 Date 对象的 toISOString 函数,它在格式化之前将所有值转换为 UTC,然后使用 Z 字符表示 UTC .

format 函数本身不进行任何转换。它依赖于 moment 对象所处的任何状态来确定要使用的时区偏移量。

format函数也接受参数来控制字符串表示。不传参数时,默认为ISO8601扩展格式with offset.

从实用的角度来看,请注意 format 在 UTC 模式下调用时将使用 +00:00,而不是 toISOString 使用的 Z。 ISO8601 都允许,但 Z 明确表示 UTC,而 +00:00 也可能来自当时恰好与 GMT 对齐的时区。例如,英国在冬天使用+00:00,在夏天使用+01:00

还认识到 ISO8601 涵盖了许多不同的格式,包括:

  • 标准时间戳格式YYYYMMDDTHHMMSSZ
  • 扩展时间戳格式YYYY-MM-DDTHH:MM:SSZ
  • 标准和扩展格式的显式偏移版本
  • 标准格式和扩展格式的无时区版本
  • Date-only 和 time-only 标准和扩展格式的版本
  • Week-number 基于格式
  • 持续时间/期间格式

还值得注意的是,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()