迷失在日期和时区

时间:2010-06-04 23:52:32

标签: java mysql hibernate datetime actionscript

我正在开发一个存储会议开始和结束日期的应用程序。到目前为止,我在比利时开发,我的服务器在法国,所以一切都在同一时区,没问题。但今天,我在旧金山,我的服务器在法国,我注意到我有一个错误。

我正在设置Flex客户端的日期(ActionScript会根据客户端本地时区自动调整日期显示,这对我来说是GMT-8。我的服务器运行在法国的Hibernate和MySQL(GMT + 1)。所以当我使用phpMyAdmin查看我的数据库,我看到日期设置为“2010-06-07 00:00:01”,但在我的Flex客户端中显示“2010-06-06 15:00:01”。

最终,我想要的是日期显示在事件的本地时区,即我设置的日期。因此,当我在比利时并且我将事件的开始日期设置为“2010-06-07 00:00:01”时,我想以这种方式检索它。

但我对于什么层适应什么感到迷茫。时区存储在DATETIME MySQL列中(我在MySQL中看不到它)?当Hibernate将它传递给具有Timezone信息的java.lang.Date时,它是否能够对它做任何事情?最终,解决这个烂摊子的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

我建议您在GMT中存储和使用所有时间,即。 GMT + 0。这是系统时钟在许多系统中使用的方式。

只有在显示时间时,才需要将时间转换为本地时区,这是您只需要在GUI上执行的操作。这可以使您的服务器时区免费。

答案 1 :(得分:2)

这真是一团糟。我之前已经写过something

在你的情况下,我建议:每个会议(概念上)都有“LOCAL DATETIME”类型的开始时间,并且还有一个时区 (时区可以隐含在其位置,也可以存储 明确地沿着其他数据)。 这在概念上是正确的:如果用户说“会议 从上午11点开始“,他的意思是”在时钟的那一刻 那个城市标志着上午11点“(即使明天政府决定改变国家GMT抵消)。 它的实现也相对简单,因为Java和Mysql并不是很聪明 时区。只是坚持(在您的场景中=这种解释:会议事件的日期时间是LOCAL,它们不代表物理连续时间线中的时间点,而是一个公民概念。(将其视为 - 几乎 - 一个字符串)当然,缺点是进行时间计算会更加困难,特别是在DB内部。

如果您需要计算从现在到该事件的间隔(如果您需要发出警报,或者将过去的事件与事件区分开来),您只需要将其转换为“物理时间”在将来,等)。因为“现在”是一个物理时间概念。在这种情况下,您必须自己进行转换。如果你需要在数据库中进行计算,你可能必须明确地在数据库中存储GMT偏移量(例如,以分钟为单位)。

答案 2 :(得分:0)

我发现了问题。 MySQL的DATETIME不存储任何时区信息,但java.util.Date存在。因此,当Date通过AMF通道发送到我的Flex客户端时,Actionscript应用了时区偏移量。我通过用整数(日期,月份,年份)替换日期类型字段并在需要时在客户端重建actionscript日期来解决问题。