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 类的旧代码进行互操作,则可以来回转换。调用添加到旧类的新方法。
从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 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。