【问题标题】:Date timezones and Daylight saving time日期时区和夏令时
【发布时间】:2019-04-02 16:33:39
【问题描述】:

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

让我们假设这种情况:

一位用户将活动安排在当地时间上午 08:00。 发送此信息进行服务时,会将上午 11:00 保存在数据库中。

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

但是,如果此时间表是在将来某个日期制定的,当客户所在的国家/地区将实行夏令时时,它将转换回 -2 小时。所以它将转换为 09:00AM 给客户端,这是错误的。

当我从服务器获取日期时如何处理夏令时?

【问题讨论】:

  • 一切都以 UTC 标准执行?
  • 你的意思是,服务器和客户端的UTC?
  • 我没有看到任何其他解决方案,仅检查当前日期和预定日期之间是否会发生夏令时。
  • 如果您在 Angular 应用程序中使用“真实”日期对象,它们将自动转换为有效负载中的 UTC 字符串。 UTC 字符串已经包含正确的时区偏移量。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 2012-09-06
      • 2012-12-21
      • 2012-07-09
      • 2013-10-13
      • 2011-04-30
      • 2015-12-23
      • 2017-02-08
      • 2012-03-21
      相关资源
      最近更新 更多