【问题标题】:Moment.js uses a different time zone than the one defined in the systemMoment.js 使用与系统中定义的时区不同的时区
【发布时间】:2023-03-23 04:41:01
【问题描述】:

我正在一台装有 Windows 10 的笔记本电脑上运行 Moment,该笔记本电脑位于美国东部标准时间,时区 UTC-05:00。我没有在笔记本电脑中定义夏令时,但是当我运行下面的代码时,Moment 会将日期转换为 UTC-04:00。为什么 Moment 使用的时区与笔记本电脑中定义的时区不同?

        var ts = "2019-04-01T18:22:57.813";
        var dateTime = moment(ts, 'YYYY-MM-DD HH:mm').toDate();
        console.log(dateTime);

【问题讨论】:

  • moment.js 对您的笔记本电脑一无所知,它只知道它运行的 javascript 引擎。如果您需要它在 特定 时区运行,请记住显式调用就可以了。
  • 但是 javascript 引擎使用笔记本电脑中定义的时区运行,不是吗?
  • 如果你问我,那么你不确定,你应该明确明确告诉 moment.js 使用哪个时区。

标签: javascript momentjs


【解决方案1】:

... EST 中的 Windows 10,时区 UTC-05:00。我没有在笔记本电脑上定义夏令时...

根据您的解释,我假设您的时区设置如下所示:

(UTC-05:00) Eastern Time (US & Canada) 显示名称与 Eastern Standard Time 的 Windows 时区 ID 匹配,这与 America/New_York 的 IANA 时区 ID 相对应。该时区目前在标准时间使用 UTC-5,在白天使用 UTC-4。在显示名称字符串中显示“(UTC-05:00)”并不重要,它仍然尊重适用于该时区的 DST。

“自动调整夏令时”功能通常会在具有夏令时的时区开启。通常不建议将其关闭,如此处所示。问题是某些软件不会评估该标志,而只是查看时区标识符。对于网络浏览器,您会发现 Edge 会使用此标志,但 Chrome 不会。

确实没有充分的理由禁用此功能。如果您需要没有 DST 的 UTC-5 时区,例如 (UTC-05:00) Bogota, Lima, Quito, Rio Branco,则只需选择该时区即可。

最后,要认识到这与 Moment.js 无关。您将看到与 JavaScript Date 对象相同的行为。由于 DST 在美国东部时间 4 月 1 日生效,因此您将看到该日期的 UTC-4。

另一方面,如果您真正想要的是将给定的日期和时间解释为 UTC-5 无论本地计算机设置,那么 Moment 可以帮助您:

var m = moment.parseZone("2019-04-01T18:22:57.813-05:00");
m.format() //=> "2019-04-01T18:22:57-05:00"

虽然如果您执行m.toDate(),那么您将返回一个Date 对象,该对象将再次获取计算机的本地时区。对于这种情况,尽量避免使用Date 对象。

【讨论】:

  • 我们有全国性的电话运营商。如果您的手机因旅行而设置为从网络获取时间和时区信息,并且当您下飞机时一切都使用当地时间真的很方便,那么在澳大利亚昆士兰您将错误地获得夏令时,因为服务器在另一个状态。此时,手动关闭它的能力至关重要。我知道您说的是计算机,而不是手机,但现在这种区别正在模糊。
  • @PeterWone - 你提到的情况通常已经很好地处理了,没有这样的“禁用 DST”设置。 Windows 对(UTC+10:00) Canberra, Melbourne, Sydney(UTC+10:00) Brisbanse 有不同的时区设置。前者做夏令时,后者不做。 Windows 10 还具有“自动设置时区”设置,它将使用操作系统上可用的最佳位置信息。对于电话来说,有位置,还有NITZ,它会传输是否适用夏令时。
  • 这需要您明确设置布里斯班时间。这样做涉及从一个笨拙的长组合框列表中进行选择。它还破坏了从网络中获取时区。打开和关闭 DST 并不那么繁琐。如果你想去教 Telstra 如何使用 NITZ,你会让我成为一个快乐的露营者。
  • @MattJohnson 感谢您的解释。我在 Chrome 上运行它;将 Adjust for daylight saving time automatically 更改为 ON 使此代码有效(输入日期没有变化)。
  • 是的,我建议大多数人打开该页面上的所有自动设置。有些人可能需要关闭“自动设置时区”,但前提是 Windows 无法识别该位置的时区。另外两个应该始终打开。
【解决方案2】:

默认 moment.js 使用本地时区(节点时区):https://momentjscom.readthedocs.io/en/latest/moment-timezone/01-using-timezones/05-default-timezone/ 如果未设置,默认情况下 node.js 使用 UTC 时区,请查看: Where does Node.js get it's timezone and how can I set it globally?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2019-06-14
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多