繁体   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