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