2010-03-16 140 views
14

我需要解析Java中日期的RFC 2822字符串表示。的示例串是在這裏:解析JAVA中的RFC 2822日期

星期六,2010 11時29分05秒-0800

它看起來很討厭,所以我想確保我做的一切權利,並會碰上怪異3月13日通過AM-PM /軍事時間問題,UTC時間問題,我預計不會出現的問題等等,可能會導致日期解釋錯誤。

謝謝!

+3

您是否嘗試過使用java.text.SimpleDateFormat? – skaffman 2010-03-16 22:10:24

+0

這看起來像是正確的使用方式,我很擔心正確的格式字符串是什麼,它看起來像是容易搞砸的東西。這似乎是RFC 2822的正確字符串,但是:「EEE,d MMM yyyy HH:mm:ss Z」(根據下面的答案) – 2010-03-16 22:38:20

+1

不是'd','dd'。 – 2010-03-16 22:51:44

回答

19

這是簡單的代碼就你問什麼(使用SimpleDateFormat

String rfcDate = "Sat, 13 Mar 2010 11:29:05 -0800"; 
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z"; 
SimpleDateFormat format = new SimpleDateFormat(pattern); 
Date javaDate = format.parse(rfcDate); 

//Done. 

PS。我沒有在這裏處理異常和併發(因爲SimpleDateFormat在解析日期時不同步)。

+0

使用此鏈接http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html獲取最新的可接受值 – rajadilipkolli 2016-09-06 09:29:59

19

如果您的應用程序使用非英語另一種語言,你可能希望通過使用備用SimpleDateFormat的構造函數來強制日期解析/格式化的語言環境:

String pattern = "EEE, dd MMM yyyy HH:mm:ss Z"; 
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.ENGLISH); 
+4

設置語言環境是絕對必需的。 Locale的android javadoc建議使用Locale.US進行計算機與計算機通信。 [link](https://developer.android.com/reference/java/util/Locale.html) – 2012-09-18 18:02:09

+0

+1 Locale.ROOT也是一個不錯的選擇,但並不適用於所有系統。 – Jules 2013-03-05 08:09:07

+0

@jasongilbert你能解釋爲什麼你說Locale「肯定是必需的」?根據文檔,它不是:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html - 但也許你的意思是「如果需要...」,這是延續我感興趣的「if」... – 2013-09-12 15:02:03

4

請記住,在[day-周「,」]在RFC-2822中是可選的,因此建議的例子並未涵蓋所有的RFC-2822日期格式。此外,RFC-822日期類型允許有許多不同的時區標記(obs-zone),這些標記未包含在「Z」格式說明符中。

我想除了尋找「,」和「 - | +」來決定使用哪種模式外,沒有簡單的辦法。

+1

+1表示星期幾是可選的。我正在設置一個嘗試/捕捉各種模式的瀑布,只是不斷嘗試變化,直到找到一個可行的模式。 – 2013-09-12 15:05:27

+0

不僅「星期幾」是可選的,還將時間的秒數聲明爲可選:'time-of-day = hour「:」minute [「:」second]'' – 2015-08-20 15:37:07