2014-09-02 62 views
0

我一直有這個疑問,並一直有這個問題。例如,我有一個表單,它要求用戶輸入日期,並通過ajax將其發佈到服務器,並將日期字段作爲日期類型接收。有些時候,我所做的是送不同的值在不同的參數,可以是這樣的:日期應該如何發佈到java?

{ 
    day: 18, 
    month: 05, 
    year: 2014, 
    hour: 10, 
    min: 30 
} 

然後在服務器,請從接收的值的日期類型。 不過,當然,我認爲這不是一個很好的做法,我開始做這樣的字符串:

{ 
    date: "2014-09-16T12:00:00Z" 
} 

但這當然不參加,爲了考慮到用戶的位置保持相應GMT + - ..

我也想過張貼毫秒,但在這裏,有一個與GMT的問題..

我使用的春天,只是備案。

那麼,應該怎麼做?最佳做法是什麼?

+0

只要搶時區? – mc10 2014-09-02 15:37:51

+0

@ mc10這應該在JavaScript還是在服務器中完成? – 2014-09-02 15:38:38

回答

1

想法和商店在UTC

一般最好保存和工作日期時間值爲UTC。只在用戶期望時才轉換爲本地日期時間。如果知道數據輸入用戶的time zoneoffset很重要,除了記錄UTC值之外,另行記錄。

問問時區

至於確定的時區或從客戶機上的用戶偏移,在網頁瀏覽器,你可以通過JavaScript詢問作爲other answer建議。但最終,如果時區或偏移量非常重要,則應該詢問用戶。列出供他們選擇的清單。使用proper time zone names,從來沒有3或4個字母的代碼。這些代碼既不標準也不唯一。

你不能相信用戶計算機上的時鐘。當你需要知道當前的時間以達到任何重要目的時,請使用服務器的時間,因爲你可以控制該機器。並確保服務器計算機連接到一個或多個time servers

序列化到ISO 8601

當序列化日期時間值的字符串,使用ISO 8601格式肯定是要走的路。

Java 8中新的java.time包通過追加時區名稱來擴展ISO 8601格式。有趣的想法,但不是標準的afaik。

請勿跟蹤,因爲epoch由數數從大紀元

跟蹤日期,時間是沒有意義的人,這使得調試和驗證棘手,而且容易出錯。日期時間庫在內部跟蹤從紀元計數。但是我們有這些庫是爲了使編程工作更容易和更正確。一些怪異類型的人可能會提出這種方法。但他們常常天真地認爲日期時間工作有多棘手和棘手。

此外,不同的環境和庫使用不同的比例:整秒,milliseconds,microsecondsnanoseconds。並且約有two dozen epochs已被用於各種計算機系統。

避免j.u.Date & .Calendar

切勿使用與Java捆綁java.util.Date和.Calendar類。它們出了名的麻煩,應該避免。而是使用Joda-Time或添加到Java 8的新java.time package來替代那些舊類。

LOCALDATE的&本地時間

良好的庫如Joda-Time報價班當你想要一個日期僅偏移時間的天只是沒時間帶。

但不要用這些認爲忽略時區會讓你的生活更輕鬆的想法。只有當你的意思是「公司的政策是我們在底特律,馬賽和赫爾辛基的工廠將在下午12點30分停止午餐時才使用它們」。工廠不會同時停止,而是在他們自己的特殊事件12:30。

如果您的意思是公司總裁將在底特律上午10點進行實時網絡直播,請將該值存儲爲調整至UTC。然後在向用戶介紹時,再次調整他們自己的底特律,馬賽或赫爾辛基時間。

+0

謝謝,這個解釋非常有用。我還有一個問題,如果我有一些日期,他們沒有mater的UTC值,我應該存儲他們在UTC和JAVA的時區設置爲0,以不改變它,我是對嗎? – 2014-09-02 16:59:34

+1

@PabloMatíasGomez我添加了最後一節作爲對您評論的回答。另外,在發佈之前搜索StackOverflow,因爲這些問題已被討論數百次。 – 2014-09-02 20:05:31

+0

我搜索了這個,並找不到任何相關的.. – 2014-09-02 20:13:52