[英]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.