如何将Gmail日期格式转换为java.util.Date?

时间:2018-04-13 10:11:37

标签: java talend

我尝试使用tPOP从Gmail帐户中检索邮件,然后将搜索到的最后一封邮件的日期保存到某处(因此,下次运行作业时,我将不再检索相同的邮件两次)。

我可以从Gmail邮件中检索的唯一日期是这种格式:

  

星期五,2018年4月13日02:26:19 -0700(太平洋时间)

如何将其转换为Java.util.Date格式?

4 个答案:

答案 0 :(得分:3)

您可以使用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);

了解更多:

答案 1 :(得分:1)

日期的其他答案,虽然它们可能大部分时间都有效,但不考虑RFC1123格式的子格式(请参阅第5.2.14节,它取代了原来的RFC-822定义)。

根据此规范定义,星期几字段是可选的(SimpleDateForamt无法处理可选字段),时区可以提供为+/-偏移(SimpleDateFormat中的大写Z),或者名称(SimpleDateFormat中的小写z)。

您可以创建SimpleDateFormats的组合,并查看哪个匹配,但这很慢。您可以使用JodaTime并构建可选部分,因为它有一个API,但这也需要时间。

或者如果你有Java8 +,你可以免费获得DateTimeFormatter.RFC_1123_DATE_TIME。这不是标准的完整实现,但如果您自己编写代码,可能会尽可能接近。而且可能更安全。

另请参阅:Getting Date in HTTP format in Java

答案 2 :(得分:1)

使用Message-ID:标题

  

下次我开始工作时,我不会两次检索相同的邮件

要避免下载相同的邮件,请使用Message-ID:标题而不是Date:。这是它的目的,唯一地标识每条消息。不需要解析任何东西。

fields described here

示例:

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

答案 3 :(得分:1)

TL;博士

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

正如the Answer by 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(太平洋时间)

     

星期五,2018年4月13日02:26:19 -0700

     

2018-04-13T02:26:19-07:00

转换

  

如何将其转换为Java.util.Date格式?

别。 java.util.Date设计糟糕,令人困惑,麻烦。躲开它。

但是,如果您必须与尚未更新为 java.time 类的旧代码进行互操作,则可以来回转换。调用添加到旧类的新方法。

Instant中提取OffsetDateTime,因为该类会替换java.util.Date以表示UTC中的时刻。

Instant instant = odt.toInstant() ;
java.util.Date d = java.util.Date.from( instant ) ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore