momentjs utcOffset()没有给出正确的时间

问题描述:

我以前在我的应用中基于存储在用户配置文件中的时区实现了日期。据我记得,最初实施时,这个工作是正确的。momentjs utcOffset()没有给出正确的时间

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

这里是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 pm,而是显示2:15 pm。

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

这是怎么回事?我是否缺少一些时间代码来处理夏令时或什么?

有几件事情:

  • -05:00:00不是一个时区,它的偏移量。阅读the timezone tag wiki中的“Time Zone!= Offset”。
  • 使用utcOffset会为所有时间设置相同的固定偏移量,所以您收到的值对于该偏移量是正确的。
  • 当您仅提供偏移量时,无法知道您的意思是美国东部时间,因为许多其他时区在不同的时间点使用相同的偏移量。
  • 使用moment-timezone附加组件,您可以使用the tzdbAmerica/New_York标识符指定东部时间。你更新后的代码将如下所示:

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

我最初开始瓦特/'TZ()你提供的'时区代码,但我想,以允许用户从他们的个人资料,选择时区一个有限的列表,特别是Windows时区中使用的相同的26个值。最初,我试图为每个Windows值找到一个命名的时区,但事实证明这是具有挑战性的。然后我看到你可以使用偏移量,所以我给Windows赋值了一个偏移量,并使用'utcOffset()'而不是'tz()'。有没有一种方法可以像使用有限列表一样使用有限列表来处理时区,因为我仍然不清楚如何去做? – im1dermike

+1

没有办法只使用偏移量。您正在谈论的时区有多个偏移量:标准时间为-5,日间时间为-4。另外,即使在Windows中,也有26个以上的时区。阅读马特引导你的标签wiki,它回答你所问的问题。 –

+0

时区选择确实充满挑战,但这不是您的问题所在。您可能想观看[此YouTube视频](https://youtu.be/2BdFg5JT9lg),其中涵盖了一些挑战。除此之外,没有一个正确的答案,除非认识到单靠胶印是不够的。你也可以找到[我对另一个问题的回答](http://stackoverflow.com/a/18407231/634824)有用。 –