2008-09-20 14 views

回答

0

使用某種子串或正則表達式從頭中提取數據。使用SimpleDateFormatter解析日期以創建Date對象。

+0

謝謝jhawk28。不過,我可以使用MailDateFormat類獲取日期。該類還解析時區,但似乎沒有簡單的方法來查找TimeZone,除了從MailDateParser複製代碼。 – mmartijn 2008-09-20 14:03:22

1

可能最容易與JodaTime解析,因爲它支持ISO8601請參閱Date and Time Parsing and Formatting in Java with Joda Time

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis(); 
System.out.println(parser2.parseDateTime(your_date_string)); 

時間必須始終保存在UTC(GMT)與時區 - 即分析從時區到GMT轉換和刪除夏令偏移並保存原始時區後。

轉換爲UTC後,您必須將時間存儲在時區中。

如果您刪除或不處理時區,則在處理來自不同時區的數據時會導致問題。

+0

**錯誤!**只要它是正確的,並且使用像喬達這樣的現代日期時間庫,它可以更好地將DateTime *與*時區一起存儲。這是處理時區。通過丟棄時區並標準化爲UTC,可以減少對用戶有用的數據,尤其是在移動/全球應用程序的情況下。 **另外SimpleDateFormat不是線程安全的!** ...我被誘惑到-1你。 – 2012-07-27 14:49:21

+0

@AdamGent這就是我所說的「如果你刪除或不處理它可能導致問題的時區...」。我會編輯以使這個晶瑩剔透。 – 2012-07-27 21:14:27

+0

請刪除博客文章too或atl注意製作simpledateformat公共靜態數組的嚴重併發危險。 – 2012-07-28 14:34:37

0

電子郵件中的時區不會顯示它發送的時區。某些程序使用UTC或GMT。當然,時區是日期時間值的一部分,也必須解析。

爲什麼你想知道它。 - 你想標準化時間戳嗎?然後使用DateFormat解析它。 - 你想檢測發送郵件的用戶的時間表嗎?這將無法正常工作。

0

看起來你已經在你的一個評論中提到了這個,但我認爲這是你的最佳答案。 JavaMail庫在javax.mail.internet.MailDateFormat中包含RFC822 Date標頭解析代碼。不幸的是,它不直接公開TimeZone解析,因此您需要直接從javax.mail.internet.MailDateParser複製必要的代碼,但值得充分利用已經完成的仔細工作。

至於存儲它,解析器會給你一個偏移量的日期,所以你應該可以把它存儲得很好,就像一個int(讓Hibernate將它翻譯成你的數據庫)。

0

我建議您使用Mime4J

該庫是專爲解析各種電子郵件垃圾。 對於解析日期,您可以使用其DateTimeParser

int zone = new DateTimeParser(new StringReader("Fri, 27 Jul 2012 09:13:15 -0400")).zone(); 

之後,我通常的日期時間轉換爲Joda's DateTime。不要使用SimpleDateFormatter,因爲它不涵蓋RFC822的所有情況。

下面將爲您展示優於Java的TZ的Joda TimeZone(來自上面的int區域)。

// Stupid hack in case the zone is not in [-+]zzzz format 
final int hours; 
final int minutes; 
if (zone > 24 || zone < -24) { 
    hours = zone/100; 
    minutes = minutes = Math.abs(zone % 100); 
} 
else { 
    hours = zone; 
    minutes = 0; 
} 
DateTimeZone.forOffsetHoursMinutes(hours, minutes); 

現在唯一的問題是,時區你會得到永遠是這可能仍然不是用戶發送電子郵件的正確的時區一個數字時區(假設郵件應用程序發送的用戶TZ和不僅僅是UTC)。

例如,-0400不是EDT(即America/New_York),因爲它不考慮夏令時節省的費用。

相關問題