2010-06-04 76 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上只需執行的操作。這使您的服務器免費時區。