2010-01-20 59 views
8

GWT不能正確序列化Java日期。當我嘗試通過電話發送用JavaScript創建的日期時,我發現從1983年4月1日(有趣)到10月25日之間的日期會被扣除一天。GWT java.util.Date序列化錯誤

這意味着,例如,1982-04-01和1982-03-31在Java方面都成爲1982-03-31。

鑑於有問題的日期,我猜想這是某種DST問題。我試過Google搜索,只發現了描述類似問題的one other reference

我也嘗試向GWT團隊提交錯誤,但好奇的是無法找到GWT的錯誤跟蹤器。

所以,我的問題是:

  1. 其他人遇到此?我在GWT 1.7上,並且想確認這是否也發生在2.0上。

  2. 我的解決方法是將日期作爲字符串發送,並在服務器上解析它們。任何人都知道更好的解決方法?

+1

我們遇到了其他與Date相關的問題(不知道它們是什麼),所以我們切換到了Strings。 – Drejc 2010-01-20 20:40:12

回答

5

假設你使用的是java.util.Date

問題1:看來,它是固定在2.0。我創建了上述兩個日期(1982-04-01和1982-03-31),並且它們正確地到達服務器(兩者分別代表服務器上的1982-04-01和1982-03-31)。我的設置是:

  • GWT 2.0
  • 的Java 1.6
  • OSX 10.6.2

問題2:你總是可以通過「自毫秒1970年1月1日00:00:00 GMT '通過異步服務 - 你可以在日期對象上使用getTime()獲得。在服務器端,您可以實例化一個新的Date,在構造函數中傳入此值:
Date date = new Date(millis);
這節省了用格式化程序和解析器的操作。

+1

實際上,GWT已經使用毫秒進行序列化,但它會降低時區。因此,瀏覽器中的「3. April 2001 00:00 GMT」可能會變成服務器上的「2001年4月23日23:00」。如果你只看到日期似乎是休息一天,即使實際時間意味着相同。 – Stroboskop 2012-01-20 13:31:08

0

我們也遇到了類似的問題。很久以前,我不記得確切的細節,但它的要點是java.util.Date和日期在Javascript中處理的方式之間有一些細微的差異。我們的解決方法與您的解決方案實際上是一樣的,其中通過線路發送的實際值通常是字符串。

1

如果您不需要進行客戶端轉換(適應用戶的時區)或計算從服務器以字符串形式發送它。

雖然沒有遇到過您的具體問題。

2

日期和時間是一個複雜的主題。轉換可能取決於瀏覽器運行的區域設置,以及服務器上的JVM和客戶端的語言環境是否最新。

在某些情況下可能會有差異,因爲在某些地區他們過去會切換時區。

GWT自發布時間起僅使用millis發送日期。由於它使用的是Date對象,因此服務器端的日期將被自動修改爲服務器時區。您確定您考慮到客戶端和服務器之間的時區可能存在差異嗎?

大衛

+0

在我的情況下,服務器和客戶端都在同一臺機器上運行,所以它肯定是GWT序列化問題。 – Domchi 2010-01-23 03:54:22

+0

他們可能現在在相同的時區。但看着日期,我想你只是發現夏令時。其中一臺機器/服務在序列化時間時沒有考慮到這一點。不管如何 - 我不認爲你想要做一個依賴於瀏覽器的時區與服務器相同的web服務。 – Stroboskop 2012-01-20 13:25:33

1

可能出現的問題是索裏在客戶端/服務器時區的差異。

+0

查看我對David的回覆,客戶端和服務器處於同一時區。我相信問題在於Javascript和Java的處理日期不同,所以發送毫秒數不夠好。 – Domchi 2011-01-12 09:34:05