2014-03-24 33 views
1

在我的頁面上,用戶輸入一個生日。該模型將日期保存爲javascript日期。在請求中,日期被轉換爲UTC,其中是給定日期的時區偏移量。在服務器端澤西島讀取該日期並添加當前時區偏移量時區和JSON閱讀運動衫

因此,作爲寫這篇文章會發生什麼(服務器處於CET)的:

用戶輸入:

01/03/1967 

客戶端傳輸:

JSON.stringify(new Date(1967,2,1)) 
"1967-02-28T23:00:00.000Z" 

服務器增加1小時,並得到正確01/03/1967

但是,如果用戶輸入

01/04/1967 

客戶端傳輸:

JSON.stringify(new Date(1967,3,1)) 
"1967-03-31T22:00:00.000Z" 

服務器增加1小時,並得到正確31/03/1967。當DST在夏天參與時,服務器可能會增加兩個小時,並且日期再次正確。

我現在只傳輸日期字符串(不是日期對象,所以只是用戶輸入的內容)。

其他人有這個問題嗎?如何解決這種差異?

我沒有從JSON.stringify中得到任何確定性的行爲,爲什麼它有時使用2小時的偏移量,爲什麼有時只有一個小時。

例如參見日期如下:

JSON.stringify(new Date(1981,5,1)) 
""1981-05-31T22:00:00.000Z"" 
JSON.stringify(new Date(1980,5,1)) 
""1980-05-31T23:00:00.000Z"" 

回答

1

您已經選擇處理您輸入了錯誤的模型。基本上你從一個普通的日期開始(沒有時間和沒有時區)。所以你應該保持這種結構。這意味着將輸入轉換爲JavaScript日期(包括時間和時區)並不是真的好,因爲這會引入您觀察到的問題。

不幸的是,JavaScript在其內置版本中並沒有提供明確的日期作爲數據類型。 但是你可以在用戶輸入至少轉換成具有ISO-8601格式,即一個字符串:YYYY-MM-DD

然後你通過JSON和服務器端發送此字符串可以將其解析到什麼都鍵入你想要的(這裏我再次推薦使用一個普通的日期,例如Java 8中的java.time.LocalDateorg.joda.time.LocalDate或類似的)。但即使您選擇java.util.GregorianCalendar,您的時區問題也應該消失,因爲日期不會更改,只會補充服務器的(不必要的)時間和時區信息。

注意:如果Jersey仍然需要由JSON生成的完整日期時區輸入,那麼您可以嘗試添加合適的時間部分(例如午夜)和手動將合適的時區部分添加到用作字符串的字符串JSON輸入。

+0

這正是我現在所做的,正如我寫的:「我現在只傳輸日期字符串(不是日期對象,所以只是用戶輸入的內容)。「但是,謝謝你的澄清 – Christian

+0

@Waxolunist啊好吧,沒有讀過這句話,我認爲這是最好的方式,所以你可以避開所有這些奇怪的時區問題,這對你介紹一個媒介JavaScript-使用時區的對象沒有任何基於這種類型的棘手的解決方法可以真正治癒這個問題,即這種方法僞造真正的輸入是什麼(一個普通的日期)。 –