日期时区和夏令时

时间:2019-04-02 16:33:40

标签: asp.net angular asp.net-core

我正在使用调度程序Web应用程序,并且我的客户端(Angular)和服务器(Asp.net核心)时区不同。 客户端处于任何时区。让我们使用(GMT-3)。 服务器是UTC。

让我们假设这种情况:

一个用户在当地时间08:00 AM安排了一个活动。 发送此信息进行投放时,它将在数据库中保存11:00 AM。

因此,当用户检索到此信息时,由于-3小时时区,客户端将转换回08:00 AM。

但是,如果此时间表是将来的某个日期,则客户所在的国家/地区将处于夏令时,它将转换回-2小时。因此它将转换为客户端的09:00 AM,那是错误的。

从服务器获取日期时如何处理夏时制?

2 个答案:

答案 0 :(得分:3)

简单地说,日期和时间应该在UTC中存储。您始终可以从UTC返回到用户的时间。使用偏移量存储日期时间的问题在于偏移量不是上下文的。例如,假设用户处于DST中,时区通常与UTC时差-3。这样,它们的当前偏移为-2。您存储了-2偏移量,现在呢?是-2是因为它们在-2区域中,还是-2是因为在DST中是-3区域。没有办法知道。实际上,您未能捕获关键信息。

存储在UTC中的日期时间没有这个问题。您可以简单地获取用户的当前时间,包括其当前偏移量(是否为DST),并将其与数据存储中的时间进行比较。您可能需要先将用户时间转换为UTC,但是在许多情况下,您不需要这样做。例如,DateTimeOffset类型足够智能,能够考虑偏移量进行比较。许多数据库也支持具有偏移量的列类型。

答案 1 :(得分:2)

如果我正确理解了该问题,则希望保持服务器使用UTC存储的日期/时间,并让客户端在处理DST时显示本地时间。我建议使用angular2-momentMomentMomemt-Timezone npm软件包。当您提供诸如America\Chicago之类的iana_timezone时,此程序包将能够自动处理DST。

moment.tz(<utc-date-time>, <iana-timezone>).format()

这将处理您在客户端中所需的所有必要转换。

请参见Stackblitz example

还签出Moment Timezone Docs