【问题标题】:Date and time handling in applications serving clients in multiple time-zones?在多个时区为客户服务的应用程序中的日期和时间处理?
【发布时间】:2009-08-16 22:41:02
【问题描述】:
与字符串处理相关的国际化问题几乎可以通过遵循以下建议来解决:使用 Unicode 并将所有内容作为 UTF-8 存储在您的数据库中,然后您将能够为使用世界上所有语言的客户提供服务。
但是与日期/时间处理相关的国际化问题呢?
问题:
- 是否有类似的易于遵循的最佳实践来解决围绕时间处理的国际化问题?
- 您如何确保您的应用程序可以为在不同时区运行的客户端提供服务?您遇到了哪些问题以及您是如何解决的?
【问题讨论】:
标签:
datetime
localization
internationalization
timezone
utc
【解决方案1】:
我有以下建议,
- 将所有时间存储在一个时区的数据库中,最好是祖鲁语 (GMT)。
- 在注册时为每个用户分配一个时区。我们通常从注册页面的语言或促销链接中嵌入的代码中找出这一点。有时,我们必须询问用户。
- 让客户端感知时区。这意味着客户端无法按原样显示来自服务器的时间。必须以当地时区和当地格式显示。
- 客户端应该努力获取系统的时区信息。如果没有,服务器可以从各种数据中猜测。我们首先使用语言,然后使用 IP 地址获得了良好的结果。在任何情况下,客户端都需要显示时间和区域信息,以便用户知道时间错误时发生了什么。
- 对于不受时区影响的某些时间值需要特殊标志。我们犯了一个错误,即当用户更改语言环境时,他们的生日会发生变化。属于此类别的其他内容包括节假日、商店营业时间等。
- 如果您必须与服务器同步时钟,请不要更改系统时间,只需将增量存储在您的客户端中。我们有一个安全要求,即时钟必须与主机同步。所以我们的客户端在启动时将系统时钟与我们的服务器同步。这是错误的做法。对于没有时区的旧系统(如 Windows 95),我们将其时间更改为 GMT。最后,老客户离开了,但我们面临的一个新问题是我们弄乱了 NTP 的准确时间。
希望我们的一些错误能帮助您避免它们。
【解决方案2】:
ZZCoder 有一些优点。这里还有一些:
- 所有日期时间值都必须有一个关联的时区。如果日期时间没有,您应该定义它的含义(例如,在某些情况下,它意味着 GMT+0;在其他情况下,这是因为代码正在计算和分配一个)。
- 您可能需要将带有日期时间的事件附加到某个位置。这意味着您将有办法确定何时允许更改日期时间的时区。这解决了生日移动的问题,但它也允许在夏令时开始或结束时进行智能行为。但是,请注意意外关系:为不同时区的多人设置会议应该引用一个规范条目,而不是复制日期时间并将其本地化。
-
不要自己进行计算:总是总是 总是要求库函数进行日期时间计算。
【解决方案3】:
通过使用一些 JavaScript 让客户端通知我们他们的时区,我很幸运。如果我记得它涉及在本地时间计算用户机器上的当前时间,然后将其与 Zulu 进行比较。