【问题标题】:Extracting utcOffset from an ISO String with Moment.js使用 Moment.js 从 ISO 字符串中提取 utcOffset
【发布时间】:2015-03-18 18:54:14
【问题描述】:

使用 moment.js,我试图从 ISO 日期字符串中提取偏移量,以便稍后在格式化纪元时间戳时使用偏移量,以确保时间戳的转换位于同一时区。

即使字符串中的偏移量是-0400,结果总是0;

var currentTime = "2015-03-18T16:10:00.001-0400";
var utcOffset = moment(currentTime).utcOffset(); // 0

我也尝试过使用 parseZone(),但没有成功。有没有办法从字符串中提取 -0400 以便我可以在格式化另一个时间时使用它?

感谢您的帮助! KC

【问题讨论】:

  • 绝对有效...jsfiddle.net/0de50bfp
  • 这很奇怪。我没有得到同样的答案。但我会回去查看代码,看看发生了什么。感谢您查看 jsfiddle 的链接。

标签: javascript momentjs


【解决方案1】:

提取偏移量的正确方法确实是parseZone

var currentTime = "2015-03-18T16:10:00.001-0400";
var utcOffset = moment.parseZone(currentTime).utcOffset();

这应该导致-240,这意味着比UTC晚240分钟,这与输入字符串中的-0400相同。如果你想要字符串形式,而不是utcOffset(),你可以使用.format('Z') 代替"-04:00".format('ZZ') 代替"-0400"

您在问题中提供的表格仅使用计算机的本地时区。因此,您的时区(或代码运行的任何地方)当前是 UTC+00:00,这可以解释为什么您会得到零。您必须使用parseZone 来保留输入字符串的偏移量。

另外 - 你的用例有点令人担忧。请记住,偏移量时区不同。时区可以在不同的时间点更改其偏移量。许多时区这样做是为了适应夏令时。如果您从一个时间戳中选择一个偏移量并将其应用于另一个时间戳,则您无法保证该偏移量对于新时间戳是正确的。

以美国东部时区为例,当夏令时于 2015 年 3 月 8 日生效时,该时区刚刚从 UTC-05:00 更改为 UTC-04:00。提供,并将其应用于 3 月 1 日的日期,您会将其置于大西洋时区而不是东部时区。

【讨论】:

  • 这是一个很好的解释,马特。关于偏移量与时区的好点。在我的情况下,所有内容都将在同一天应用,除了在时间快到一天结束的奇怪情况下。在那种情况下,尤其是在夏令时前后,我会应用错误的时间并将评估其他选项。谢谢你的解释!
  • 这对我有用 moment().utcOffset(date).utcOffset()
  • @Nipun - 是的,这也可以。它的正确性稍差一些,因为您创建的时刻对象将与您在 date 中提供的对象不同,但由于您无论如何都将其丢弃,您将得到相同的结果。
  • 没有马特您发布的解决方案我没有得到正确的结果。试试这个网站。它不会给出正确的时区。
  • 否决,@MattJohnson 答案中提供的 jsFiddle 不会从 currentTime 中提取偏移量,它实际上只是输出本地机器的当前偏移量。 (巧合的是,他的本地机器实际上可能有一个偏移量为 -0400 的时区)@Nipun 的解决方案按预期工作并返回 -240,而不管本地机器的时区如何。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 2015-05-10
  • 2017-01-31
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2015-06-12
  • 2017-07-17
相关资源
最近更新 更多