2010-06-04 81 views
1

我正在开发一个存储会议开始和结束日期的应用程序。直到现在,我在比利时发展,我的服务器在法国,所以一切都在同一时区,没有问题。但今天,我在旧金山,我的服务器在法国,我注意到我有一个错误。我自动调整日期显示根据客户端本地时区,这是我今天的GMT-8。我的服务器运行在法国(GMT + 1)的Hibernate和MySQL。当我使用phpMyAdmin查看数据库时,发现日期设置为“2010-06-07 00:00:01”,但在我的Flex客户端中显示“2010-06-06 15:00:01”。遗失日期和时区

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

但是我失去了什么层适应什么。时区存储在DATETIME MySQL列中(我在MySQL中看不到它)?在将它传递给具有时区信息的java.lang.Date时,Hibernate是否支持它?最终,解决这个混乱的最好办法是什么?

+0

这对我来说并不明确:“如果我想要的是日期显示在事件的本地时区中,这是我设置的日期。”谁是“我”?用户 ?会议发生在一个固定的已知时区,或取决于会议的位置(由用户设置?) – leonbloy 2010-06-05 00:10:33

+0

'java.util.Date'没有时区信息。这通常是格林威治时间(大纪元时间)。顺便说一句:时间部分似乎是在你的Flex应用程序无关,为什么你显示它? – BalusC 2010-06-05 00:13:25

+0

我错过了什么吗?只有使用NOW()/ CURRENT_TIMESTAMP/etc来填充DATETIME时,此问题才会存在。如果用户提供日期和时间,应该写入数据库 - 时区不应生效。在不同时区提供基于时间的通知将是一个问题,但是...... – 2010-06-05 00:30:06

回答

2

这真是一团糟。我以前写过关于它的something

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

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

0

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

+0

不,“java.util.Date”不存储任何时区信息。从01-01-1970 00:00:00 UTC开始,它只不过是一个毫秒数的容器。一个'java.util.Date'对象代表了一个“绝对”的时刻,它本身并不知道任何关于时区的信息。 – Jesper 2010-06-05 21:28:26

3

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

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