如何在存储日期和时间的应用程序中处理多个TimeZones?

时间:2010-07-08 21:01:25

标签: mysql sql-server oracle database-design timezone

我意识到这有点主观,但我希望在这里选择大家如何处理多个时区?这里有各种类似的问题,也有各种各样的答案。

如何在您构建的应用中与此相关,以及您必须克服哪些问题?

6 个答案:

答案 0 :(得分:13)

您始终将日期/时间存储在一个时区(10个中的9个是伦敦时间)并将其显示转换为您用户的时区。这是严格的应用程序级问题而不是db。

答案 1 :(得分:11)

在工作中,我们同时管理多个时钟,不仅是时区,还有一些用于航天器导航的深奥时钟。

真正重要的唯一事情是:您与 ONE AND ONLY ONE CLOCK 一致,无论您选择哪一个,并且您拥有适当的时钟转换,当你需要一个时钟视图 时钟与你的一个时钟不同时。

所以:

唯一一个时钟:选择最简单的一个解决您的问题,很可能是 UTC (有些人会错误地称之为格林威治,但重点仍然是:零线。)

适当的时钟转换:这取决于您的应用,但您需要提出并回答以下两个问题:我需要多少分辨率?我是否需要确保我占用闰秒?一旦你回答,你可以选择标准库或更多的estoreric库。同样,你必须提出这些问题。

查看时间:当有人选择时间视图(例如太平洋时间)时,只需根据需要调用相应的时钟转换

真的,就是这样。

至于图书馆,我使用Python进行脚本编写,但使用NAIF Spice Library进行任务设计,并使用内部代码进行航天器导航。它们之间的区别仅仅在于考虑到你需要考虑的一切(地球自转,相对论,时间膨胀,闰秒等)的分辨率和可靠性。当然,你会选择适合你需要的库。 / p> 祝你好运。

编辑:

我忘了提及:不要尝试实施自己的时间管理库 - 使用搁置一个。如果你尝试,你可能会成功,但你的真正的项目将会死亡,你只会有一个平均日期时间库来展示它。也许我被夸大了,但制作一个可靠的,通用的日期时间库远非微不足道,即它本身就是一个项目。

答案 2 :(得分:1)

我正在使用的一个项目是使用SQL Server 2005和GETUTCDATE()以UTC格式存储日期。

答案 3 :(得分:0)

我认为sql server 2008的新最佳实践是始终使用datetimeoffset数据类型。将日期标准化为UTC也是一种良好做法;但并不总是可行或可取的。

有关更多想法,请参阅此博文: http://blogs.msdn.com/b/bartd/archive/2009/03/31/the-death-of-datetime.aspx

答案 4 :(得分:0)

+1 @ kubal5003。

日期和时间的显示总是因文化和时区而变得复杂,因此最好使用距离用户最近的层(例如浏览器或本地应用程序)来执行此操作。它还将一些负载从数据库移动到用户的计算机。

但是服务器生成的报告有例外。所以我存储时区名称/ ID(偶尔只是偏移/偏差)来查找一天的开始。这可能是系统范围的,也可能是基于客户/品牌的。

对于Web应用程序,我通常通过地理位置检测用户的默认时区(这很少出错,因为地理数据现在非常准确)。

答案 5 :(得分:0)

您需要维护用户时区信息和所有时区信息。 并始终以UTC格式存储时间。当您想要向特定用户显示该信息时,只需访问该用户的时区(为该用户存储)并从UTC中存储的时间中加上或减去该时间并显示此时间。这将是在查看信息的用户的时区。