【问题标题】:How would I add support for timezone in my application?如何在我的应用程序中添加对时区的支持?
【发布时间】:2014-03-01 06:52:20
【问题描述】:

我们目前正在数据库中存储太平洋/夏威夷的本地日期时间。假设我无法将这些日期更改为 UTC,我需要添加哪些信息来支持时区?

我的想法是:

  • 首先,添加一个时区字段以指示用户正在查看的时区。 (用户将从下拉列表中选择)
  • 其次,添加时区字段以指示数据库中当前日期时间值的时区(太平洋/夏威夷)。
  • 第三,添加偏移量以覆盖 DST 小时

假设来自 America/Los_Angeles 的用户查看该站点,它会从数据库中提取日期时间,附加偏移量并应用夏威夷的时区,然后再将其转换为洛杉矶时间。对于任何计算或比较,我会先将夏威夷时间转换为 UTC,然后将 UTC 结果转换为洛杉矶。我错过了什么吗?

【问题讨论】:

    标签: timezone


    【解决方案1】:

    您的问题非常广泛,在不了解您的应用程序、平台、您如何使用收集日期和时间、它们代表什么等信息的情况下,我只能笼统地说。

    • 建议以 UTC 存储,但这只是惯例。主要要求是您存储数据的时区没有夏令时(夏威夷自 1947 年以来就没有夏令时),并且您确实依赖计算机的操作系统或环境设置来确定使用什么时区。如果必须,您可以使用夏威夷时区。一定要在某个地方记录它!在应用程序的生命周期中出现的任何其他人肯定会感到惊讶。

    • 虽然它会成功,但这样做绝对没有优势。当您推出这些更改并继续使用 UTC 时,您可以轻松地将数据转换为 UTC。 (这将是首选方法。)

    • 夏威夷的 IANA 时区 ID 是 "Pacific/Honolulu"。如果您在 Windows/.Net 上,TimeZoneInfo ID 是"Hawaiian Standard Time"。无论哪种方式,它们都必须完全按照这种方式进行拼写、大小写和标点符号。

    • 确保您了解时区偏移和时区是两个不同的概念。虽然夏威夷可能使用 -10:00 的固定偏移量,但大多数时区无法保证。请阅读timezone tag wiki了解更多详情。

    • 您可能不应该尝试实现自己的时区逻辑。几乎每种语言都有这方面的库。查看适合您平台的内容。 (如果您提供详细信息,我可以提供建议。)

    【讨论】:

    • 嗨,马特,感谢您的回答。我可以在另一个场景中找到你吗?如果我存储数据的时区有夏令时,那么存储在本地日期时间中仍然有效吗?我应该将我的问题改写为:存储本地日期时间的时区和偏移量是否为我提供了足够的信息来解释 DST?我会遇到什么样的问题?
    • 另外,我应该注意我只存储一个时区的本地日期时间。因此,如果我在洛杉矶有一台服务器,那么从纽约访问的人会将他们的输入从纽约当地时间转换为洛杉矶当地时间,然后再存储。
    • 您必须为每个值存储本地时间和偏移量。您不能单独存储偏移量,因为每个时区的偏移量将在标准偏移量和日光偏移量之间交替变化。如果您想采用这种方法,请考虑使用为其设计的数据类型,例如 SQL Server 中的 datetimeoffset 或 Orcale 和 Postgres 中的 timestamptz
    • 请务必阅读daylight saving time。您应该了解,存储可能会发生 DST 更改的本地日期时间而不存储偏移量会导致潜在的模棱两可的数据。
    • 就最佳实践而言-您的应用程序和存储在中的数据应该不关心服务器的时区是什么。谁知道,您可能会从 a 点到 b 点拿起一台服务器,并在此过程中更改时区。你想让数据无效吗?可能不是。将所有时间存储为 UTC 日期时间,或使用 datetimeoffset 是解决方案。
    【解决方案2】:

    将时间存储为 UTC 时间将是一种更可靠的解决方案,因为时区对于显示数据的特定 PC 而言是本地的。在您的情况下,如果您存储时间加上偏移量,您如何决定存储哪个偏移量?如果涉及多个时区,这不是一个可行的解决方案。

    【讨论】:

    • 您好,感谢您回答迈克。但是假设我无法更改数据库以在 UTC 中存储日期时间,是否仍然可以添加对时区的支持?
    • 关于偏移量问题,由于夏威夷不支持夏令时,我只需要处理数据库中所有当前日期时间的一个偏移量值。如果我们要去一个有夏令时的地方,我被告知我们会有另一个数据库,其中包含那个时区的日期时间。并且由于它将是一个新数据库,因此输入的新日期时间将具有正确的 DST 偏移量。
    • 这比转换为 utc 容易吗?我没看到。
    • 不,这肯定不容易。但这可行吗?显然,我并没有避免选择使用 UTC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多