[英]How to convert Gmail date format to java.util.Date?
我嘗試使用tPOP從Gmail帳戶中檢索郵件,然后將上次檢索到的郵件的日期保存在某處(因此,下次運行該作業時,我將不會兩次檢索相同的郵件)。
我可以從gmail郵件中檢索的唯一日期是這種格式:
2018年4月13日星期五02:26:19 -0700(PDT)
如何將其轉換為Java.util.Date格式?
您可以將SimpleDateFormat用於此任務:
String dt = "Fri, 13 Apr 2018 02:26:19 -0700 (PDT)";
Date date = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH).parse(dt);
閱讀更多:
String input = "Fri, 13 Apr 2018 02:26:19 -0700 (PDT)" ;
…
java.util.Date.from( // Convert from modern classes `OffsetDateTime` & `Instant` to troublesome legacy class `Date`. Do so only if absolutely necessary.
OffsetDateTime.parse(
input.substring( 0 , input.indexOf( " (" ) ) , // Drop the ambiguity-prone pseudo-zone ` (PDT)` from the end.
DateTimeFormatter.RFC_1123_DATE_TIME // Parse using a built-in formatter defined for RFC 1123 strings.
)
.toInstant() // Extract UTC value (`Instant`) from `OffsetDateTime`.
) // Returns a legacy `java.util.Date` object.
DateTimeFormatter.RFC_1123_DATE_TIME
如GPI的答復中所述 ,Java為RFC 1123(另請參閱RFC 822)中定義的這種格式提供了格式化程序。
除了偽時區代碼(例如PDT
不能被明確解析,因為它們不是標准化的並且也不是唯一的。 所以剝掉它。
String original = "Fri, 13 Apr 2018 02:26:19 -0700 (PDT)";
// Delete non-standard pseudo-zone at end.
String input = original;
if ( input.endsWith( ")" ) ) {
int index = input.indexOf( " (" );
input = input.substring( 0 , index );
}
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME;
OffsetDateTime odt = OffsetDateTime.parse( input , f );
轉儲到控制台。
System.out.println( original );
System.out.println( input );
System.out.println( odt );
2018年4月13日星期五02:26:19 -0700(PDT)
2018年4月13日星期五02:26:19 -0700
2018-04-13T02:26:19-07:00
如何將其轉換為Java.util.Date格式?
別。 java.util.Date
設計不當,令人困惑且麻煩。 躲開它。
但是,如果必須與尚未更新為java.time類的舊代碼進行互操作,則可以來回轉換。 調用添加到舊類中的新方法。
從OffsetDateTime
提取一個Instant
,因為該類替換java.util.Date
來表示UTC中的時刻。
Instant instant = odt.toInstant() ;
java.util.Date d = java.util.Date.from( instant ) ;
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 。 不需要字符串,不需要java.sql.*
類。
在哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
迄今為止,其他答案雖然可能在大多數時間都可以使用,但並未考慮RFC1123格式的子標題 (請參閱5.2.14節,該內容替代了原始RFC-822定義)。
根據此規范定義,“星期幾”字段是可選的( SimpleDateForamt
無法處理可選字段),並且時區既可以作為+/-偏移量提供(在SimpleDateFormat中為大寫字母Z),也可以提供為名稱(在SimpleDateFormat中為小寫z) 。
您可以創建SimpleDateFormats的組合,然后查看哪個匹配項,但這很慢。 您可以使用JodaTime
並構建可選部件,因為它具有用於此的API,但這也需要時間。
或者,如果您使用Java8 +,則可以免費使用DateTimeFormatter.RFC_1123_DATE_TIME
。 這不是標准的完整實現,但可能與您自己編寫的代碼接近。 而且可能也更安全。
另請參閱: Java中以HTTP格式獲取日期
Message-ID:
標頭代替 下次我執行工作時,不會重復檢索相同的郵件
為避免下載相同的消息,請使用Message-ID:
標頭,而不要使用Date:
這是其目的,以唯一地標識每個消息。 無需解析任何內容。
請參閱此處描述的字段 。
例:
Message-ID: <f6a363400703050910y7d591d42raf015fcef16f95ea@mail.gmail.com>
Date: Mon, 5 Mar 2007 09:10:41 -0800
From: UserName <address@gmail.com>
To: OtherUserName <address@system.com>
Subject: Subject Line
MIME-Version: 1.0
使用此字符串作為唯一標識符:
f6a363400703050910y7d591d42raf015fcef16f95ea@mail.gmail.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.