2012-01-03 66 views
3

我在UTC時區存儲服務器端的日期。 當客戶端(瀏覽器)要一些時間傳遞給服務器發送日期像將javascript日期傳遞給java

"Tue Jan 03 2012 16:50:32 GMT+0400 (Russian Standard Time)" 
  1. 是在所有瀏覽器這種格式標準?
  2. 如果1.爲假,我該如何重新定義Date格式函數?這是一個很好的做法嗎?
  3. 如何將JS Date s轉換爲UTC java.util.Datejava.text.SimpleDateFormat

UPDATE

我認爲傳遞日期格式的字符串(用時區的一部分)會導致頭痛少,因爲我不應該打擾日期轉換爲UTC在客戶端。所以我在JS代碼中避免了任何日期轉換。

+1

客戶端代碼是什麼樣的?如果它可以通過「Unix紀元以來的毫秒數」值,這將只會簡單一些,只需要簡單的整數解析。 – 2012-01-03 12:58:20

+0

請參閱http://stackoverflow.com/questions/999172/how-to-parse-date-in-java – 2012-01-03 13:01:42

+0

@ jon-skeet請看看我的更新。謝謝。 – 2012-01-03 13:06:44

回答

3

您應該發送自前綴運算符+前綴運算符以來的時間(1970年1月1日UTC)以來的毫秒數。

發送帶有時區的任何東西都需要兩臺機器具有相同的時區定義,這意味着您可能會遇到微妙的錯誤,其中兩臺日期在一臺機器上以一個順序出現,但在另一臺機器上以不同順序出現。你可以通過使用millis自時代表示來消除整個類的錯誤。

回答您的問題:

是在所有瀏覽器這種格式標準?

Date.prototype.toStringtoUTCString都取決於實施,但toISOString是可靠的。

http://es5.github.com/#x15.9.5.43

15.9.5.43 Date.prototype.toISOString ()#ⓉⓇ

該函數返回字符串值代表在由該日期對象表示時間的實例。字符串的格式是15.9.1.15中定義的日期時間字符串格式。所有字段都存在於字符串中。時區始終是UTC,由後綴Z表示。如果此對象的時間值不是有限數字,則會引發RangeError異常。

15.9.1.15日期時間字符串格式#ⓉⒺⒷ

ECMAScript中定義了基於ISO 8601擴展格式的簡化日期時間的字符串互換格式。格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

http://es5.github.com/#x15.9.5.2

15.9.5.2 Date.prototype.toString ()#ⓉⓇ

此函數返回一個字符串值。該字符串的內容是與實現相關的,但旨在以方便的,人類可讀的形式表示當前時區中的日期。

http://es5.github.com/#x15.9.1.15

15.9.5.42 Date.prototype.toUTCString ()#ⓉⓇ

此函數返回一個字符串值。字符串的內容是與實現相關的,但旨在用UTC以方便的,人類可讀的形式表示Date。

注意目的是生成比15.9.1.15中指定的格式更可讀的日期的字符串表示。選擇的格式不明確或容易機器解析並不重要。如果實現沒有首選的人類可讀格式,建議使用15.9.1.15中定義的格式,但使用空格而不是用於分隔日期和時間元素的「T」。

1

您可以發送UNIX time格式的數據,也許?

2

我不知道這種格式是否爲所有瀏覽器標準化。

但是,您可以在JavaScript中使用getTime()函數,該函數返回從1 January 1970 00:00:00 UTC開始的毫秒數,並用此值初始化Java Date object

+0

恐怕javascript .getTime()會返回當前時區調整的值。 – 2012-01-03 13:16:26

+0

@PlasticRabbit:它不應該......當你說你「害怕」時,你的意思是你害怕文檔可能不正確,或者你已經嘗試過並看到錯誤的值? – 2012-01-03 13:22:46