【问题标题】:momentjs utcOffset() not giving correct timemomentjs utcOffset() 没有给出正确的时间
【发布时间】:2016-05-16 19:47:20
【问题描述】:

我之前根据存储在用户个人资料中的时区在我的应用中实现了日期。据我所知,这在最初实施时工作正常。

我正在显示的数据库中存储的所有日期都是 UTC,这意味着当我保存日期(在 C# 中)时,我使用 DateTime.UtcNow

这是我在 Angular 中使用的 momentjs 代码,用于以实际值呈现我的日期:

moment.utc('2016-05-16T19:14:06.51').utcOffset('-05:00:00').format('M/D/YYYY h:mma');

-05:00:00 偏移量适用于东部时间。我预计上面指定的 UTC 日期会显示为下午 3:15,而是显示为下午 2:15。

为了仔细检查我没有使用错误的日期值,我进入 MS SQL Management Studio 并运行 SELECT GETUTCDATE(),它返回了 2016-05-16 19:44:05.850。目前是下午 3 点 44 分,但使用上面的 momentjs 代码正在渲染下午 2 点 44 分。

发生了什么事?我是否缺少一些处理夏令时的 momentjs 代码?

【问题讨论】:

    标签: angularjs datetime momentjs


    【解决方案1】:

    一些事情:

    • -05:00:00 不是时区,而是偏移量。阅读the timezone tag wiki 中的“时区!= 偏移量”。
    • 使用utcOffset 始终设置相同的固定偏移量,因此您收到的值对于该偏移量是正确的。
    • 如果您只提供偏移量,它就无法知道您指的是美国东部时间,因为许多其他时区在不同的时间点使用相同的偏移量。
    • 使用moment-timezone 插件,您可以使用the tzdb 中的America/New_York 标识符指定东部时间。您更新后的代码如下:

      moment.utc('2016-05-16T19:14:06.51').tz('America/New_York').format('M/D/YYYY h:mma');
      

    【讨论】:

    • 我最初是使用您提供的 tz() 时区代码开始的,但我希望允许用户从有限列表中选择他们的配置文件中的时区,特别是使用的相同 26 个值Windows 时区。最初,我试图为每个 Windows 值找到一个命名时区,但事实证明这具有挑战性。然后我看到你可以使用偏移量,所以我只是为 Windows 值分配了一个偏移量,并使用 utcOffset() 而不是 tz()。有没有办法像我尝试的那样使用有限列表来处理 momentjs 的时区,因为我仍然不清楚该怎么做?
    • 没有办法只使用偏移量。您正在谈论的时区有多个偏移量:标准时间 -5 和白天时间 -4。此外,即使在 Windows 中,也有超过 26 个时区。阅读马特为您提供的标签 wiki,它回答了您提出的问题。
    • 时区选择确实具有挑战性,但这不是您的问题所在。您可能想观看this YouTube video,其中涵盖了一些挑战。对此没有一个正确的答案,除了认识到仅靠抵消是不够的。您可能还会发现 my answer to another question 很有用。
    • 天哪。我认为现在是时候尝试与产品负责人讨论他们是否会接受使用当地时间。感谢您的信息!
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多