关于datetime:在多个时区为客户提供服务的应用程序中的日期和时间处理?

Date and time handling in applications serving clients in multiple time-zones?

与字符串处理相关的国际化问题几乎可以通过遵循以下建议来解决:使用Unicode并将所有内容存储为数据库中的UTF-8,然后您就可以使用世界上所有语言为客户提供服务。

但与日期/时间处理相关的国际化问题又如何呢?

问题:

  • 是否有类似的易于遵循的最佳实践来解决围绕时间处理的国际化问题?
  • 您如何确保您的应用程序可以为在不同时区运营的客户提供服务? 你遇到了什么问题,你是如何解决的?

我有以下建议,

  • 使用一个时区将所有时间存储在数据库中,最好是Zulu(GMT)。
  • 在注册时为每个用户分配时区。我们通常会从注册页面的语言或促销链接中嵌入的代码中找出这一点。有时候,我们要问用户。
  • 让客户了解时区。这意味着客户端无法按原样显示服务器的时间。必须以本地时区和本地格式显示。
  • 客户应该努力获取系统的时区信息。如果没有,服务器可以从各种数据猜测。我们首先使用语言获得了良好的结果,然后是IP地址。在任何情况下,客户端都需要显示带有区域信息的时间,以便用户在时间错误时知道发生了什么。
  • 对于不受时区影响的特定时间值,需要特殊标记。当用户的生日改变他们的语言环境时,我们有一个错误。属于此类别的其他事物包括假期,营业时间等。
  • 如果您必须将时钟与服务器同步,请不要更改系统时间,只需将delta存储在客户端中即可。我们有一个安全要求,即时钟必须与主机同步。所以我们的客户端在启动时与我们的服务器同步系统时钟。这是错误的做法。对于没有时区的Windows 95等旧系统,我们将时间更改为GMT。最后,老客户离开了,但我们面临的一个新问题是我们搞砸了NTP的准确时间。
  • 希望我们的一些错误能帮助你避免它们。


    ZZCoder有一些好处。这里还有一些:

    • 所有日期时间值都必须具有关联的时区。如果日期时间没有一个,你应该定义它意味着什么(例如,在某些情况下,它将意味着GMT + 0;在其他情况下,这是因为代码正在计算它并分配一个)。
    • 您可能需要将具有日期时间的事件附加到某个位置。这意味着您将有办法确定何时允许更改日期时间的时区。这解决了生日移动的问题,但它也允许在夏令时开始或结束时的智能行为。但是,要注意意外的关系:为不同时区的几个人设置会议应该引用一个规范条目,而不是复制日期时间并将它们本地化。
    • 不要自己做计算:始终总是要求库函数进行日期时间计算。


    通过使用一些JavaScript让客户告知我们他们的时区,我有一些运气。如果我记得它涉及在当地时间计算用户机器上的当前时间,然后将其与Zulu进行比较。