簡體   English   中英

如何將Gmail日期格式轉換為java.util.Date?

[英]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);

閱讀更多:

tl; dr

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.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

迄今為止,其他答案雖然可能在大多數時間都可以使用,但並未考慮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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM