针对当前时区调整的不同夏令时的UTC日期[重复]

Posted

技术标签:

【中文标题】针对当前时区调整的不同夏令时的UTC日期[重复]【英文标题】:UTC date from different daylight savings adjusted for current timezone [duplicate] 【发布时间】:2016-09-18 06:37:36 【问题描述】:

我将日期以 UTC 格式保存在 mongodb 中,例如“2016-01-28T00:00:00.000Z”。在客户端中,我使用 moment.js 来格式化日期。但是,当我创建这个特定日期的某个时刻时,夏令时开始发挥作用:

>moment("2016-01-28T00:00:00.000Z").format()

“2016-01-27T19:00:00-05:00”

如果我使用时刻的时区来调整这个时间,它将不起作用,因为此时偏移量是-4,而不是-5。这次调整的正确方法是什么,这样我得到的不是 1/27/16,而是 1/28/16,这就是我想要的。目前,我想在几分钟内获得.utcOffset 的一个解决方案,并将其添加到我的时间:

moment("2016-01-28T00:00:00.000Z").add( -moment("2016-01-28T00:00:00.000Z").utcOffset(),'minutes').format()

“2016-01-28T00:00:00-05:00”

但是,我不确定这是否是最好的方法。

【问题讨论】:

您的输入中有一个偏移量(Z,用于 UTC,相当于 +00:00)。请参阅 dup 帖子中的答案以了解如何使用 parseZone 函数来保留它,或 utc 函数以独占使用 UTC。 【参考方案1】:

查看ISO 8601 的规范,特别是围绕时区指示符。

格式化输入字符串末尾的“Z”将数字指定为 UTC 时区。 moment 库采用 UTC 日期并自动将其转换为本地时区,在您的情况下,这意味着减去几个小时。

如果您取消“Z”,则moment 会将其解释为“未指定”时区,并且不会在给定日期时间中添加或减去任何时间。所以请注意:

> moment("2016-01-28T00:00:00.000Z").format()
< "2016-01-27T19:00:00-05:00"
> moment("2016-01-28T00:00:00.000").format()
< "2016-01-28T00:00:00-05:00"

删除“Z”后,moment 仍会以-05:00 作为时区指示符来格式化新日期,但不会修改日期时间。

【讨论】:

抱歉,这不是一个好主意。虽然它可能给出相同的 本地时间 值,但您实际上已经更改了时间戳的意图,将其置于不同的时间点。有关正确方法,请参阅 dup 链接中的答案。

以上是关于针对当前时区调整的不同夏令时的UTC日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

UTC 时间、时区、夏令时和夏令时切换日期

需要当前日期在具有日期格式的“UTC”时区[重复]

在 Python 中为时间分配日期

如何在 R 中找到给定日期和时区的夏令时调整?

测试正确的时区处理

在 Javascript 中使用时区和夏令时