2012-12-07 85 views
3

我在解析API返回的日期格式時出現問題,而且我從未見過(我相信它是自定義格式)。日期的一個例子:使用SimpleDateFormat解析自定義時間格式

/Date(1353447000000+0000)/ 

當我第一次遇到這種格式它沒有多久我就看出這是在一個時區偏移毫秒的時間。雖然我使用SimpleDateFormat提取這個日期時遇到了麻煩。這是我第一次嘗試:

String weirdDate = "/Date(1353447000000+0000)/"; 

SimpleDateFormat sdf = new SimpleDateFormat("'/Date('SSSSSSSSSSSSSZ')/'"); 

Date d1 = sdf.parse(weirdDate); 
System.out.println(d1.toString()); 
System.out.println(d1.getTime()); 
System.out.println(); 

Date d2 = new Date(Long.parseLong("1353447000000")); 
System.out.println(d2.toString()); 
System.out.println(d2.getTime()); 

輸出:

Tue Jan 06 22:51:41 EST 1970 
532301760 

Tue Nov 20 16:30:00 EST 2012 
1353447000000 

日期(和解析的毫秒數),甚至還沒有接近,我一直無法找出原因。經過一些故障排除後,我發現我嘗試使用SDF的方式顯然是有缺陷的。例如:

String weirdDate = "1353447000000"; 

SimpleDateFormat sdf = new SimpleDateFormat("S"); 

Date d1 = sdf.parse(weirdDate); 
System.out.println(d1.toString()); 
System.out.println(d1.getTime()); 

輸出:

Wed Jan 07 03:51:41 EST 1970 
550301760 

我不能說我曾經嘗試過使用SDF通過這種方式,只是在分析毫秒的時間,因爲我通常會使用Long.parseLong()和公正直接將它傳遞給new Date(long)(實際上我現在所使用的解決方案只是一個正則表達式並解析一長串)。我正在尋找一個更清晰的解決方案,我可以輕鬆地提取這個時間以毫秒爲單位的時區,並快速解析出日期,而無需手動處理。任何人有任何想法或可以發現我上面邏輯中的錯誤?非常感謝幫助。

回答

3

採取毫秒值的字符串:

/Date(1353447000000+0000)/ 

,並通過該值作爲一個長成Date構造:

Date date = new Date(1353447000000); 

和使用的SimpleDateFormat格式化日期對象。

+0

是的,我不認爲SDF知道如何處理以大量小單位表示的日期時間,無論是自紀元以來的毫秒數還是自紀元以來的數天。即使在設計層面,這種情況的跡象表明,日月和日年使用兩種不同的模式字母。 –

+0

是的,這是我現在的解決方案。我有一個正則表達式提取這個值,就像你上面解釋的那樣。我也將不得不分析時區偏移量以及我想象的。我只是希望避免這種手動處理... – ggrigery

1

儘管現在你正在做的很多,但我認爲手動方法並沒有太大的錯誤 - 除非你必須去那裏纔是一種恥辱!

我不相信你可以單獨使用SDF。 這會給你一個日期合理「優雅」:

Date date = new Date(Long.parseLong(weirdDate.split("[^\\d]")[6])); 

我敢肯定,你已經考慮過,但你說的API的生產商,看看他們爲什麼在這樣的輸出這個值一個奇怪的格式?如果界面不公開和/或不廣泛,他們可能會考慮將其改爲更傳統一些。

+0

正如你所說,我已經考慮過要求API的所有者爲什麼他們使用這種奇怪的格式,但我沒有。這是一家相當大的公司,我認爲他有很多客戶已經對他們的API進行了編碼,所以對他們來說這種改變可能是不可行的(儘管這引發了這個問題是否在......之前提出的問題) – ggrigery