【问题标题】:Why is day off by 1 and hours is way off on mor ISO 8601 in Moment js?为什么 Moment js 中的 mor ISO 8601 上放假 1 天,放假几小时?
【发布时间】:2016-09-28 00:51:47
【问题描述】:

使用 ISO 8601 字符串,我正在使用 Moment js,目前正在使用 moment("2014-05-08T00:20:40Z").format("HH:mm:ss") 来简单地获取 "00:20:40" 的字符串时间,bu

【问题讨论】:

  • 时间戳中的 z 表示 UTC,所以我最好的猜测是您不在 UTC 时区,因此它将时间戳格式化为您的时区

标签: javascript datetime reactjs momentjs iso


【解决方案1】:

您的 ISO 日期是 UTC 日期。这就是结尾处的Z 的含义。所以你在 UTC 以西 7 个时区。

您开始的时间是 8 日午夜后 20 分钟。如果你在法国巴黎运行你的代码,你会得到正确的答案(忽略“夏令时”调整)。但是,由于您位于西部 7 个时区,因此您会在下午 5:20 到达,而您仍处于前一个日历日。

从一种看待事物的方式来看,没有什么可以“修复”的。基于您所在位置的本地时间版本表示与原始 ISO UTC 时间相同的时间点。一切正常;日期值的默认表示是 本地 时间。如果您想这样做,JavaScript 中的 Date 原始对象具有 API 可以访问 UTC 术语中的组件。

如果您想取回原始 ISO 字符串,可以使用 .toISOString()

moment("2014-05-08T00:20:40Z").toISOString()

或者,您可以在格式字符串中包含时区标签:

moment("2014-05-08T00:20:40Z").format("HH:mm:ss zz")

(请注意,格式字符串中的“z”与 ISO 时间中的“Z”的含义不同。它只是格式化特殊字符,从单词“zone”的第一个字母开始。在ISO字符串,它是单词“zero”的第一个字母,表示时间与UTC时间的偏移为零。有人称它为“Zulu Time”,因为那个“Z”。)

【讨论】:

  • 正确,但另请参阅:maggiepint.com/2016/05/14/moment-js-shows-the-wrong-date。或者,您可能需要为您的用例使用正确的工厂函数。
  • @MaggiePint 这是一篇很棒的文章;在这样的问题中,总是很难说出更大的背景是什么。例如,这个 ISO UTC 日期最初是从哪里来的?这里最简单的解决方案可能是修改服务器上的格式。即便如此,它也取决于应用程序语义。无论如何,谢谢,这是好东西,我会尽量记住链接到它(正如你所说,这些总是出现!)。
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多