tl;博士
显然您想解析一个字符串,该字符串表示挂钟时间比 UTC 早四小时的时刻,然后调整为 UTC 挂钟时间。
OffsetDateTime.parse(
"Wed Dec 23 13:00:00 GMT+04:00 2015" ,
DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu" , Locale.US )
)
.toInstant() // Adjust from four hours ahead of UTC to UTC itself by extracting a `Instant`.
.toString()
2015-12-23T09:00:00Z
java.time
现代方法使用 java.time 类而不是可怕的旧 java.time 类。
String input = "Wed Dec 23 13:00:00 GMT+04:00 2015" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss OOOO uuuu" , Locale.US ) ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;
odt.toString(): 2015-12-23T13:00+04:00
如果要将其调整为 UTC,最简单的方法是提取 Instant。根据定义,Instant 类始终采用 UTC。
Instant instant = odt.toInstant() ;
或者,要保留OffsetDateTime 的灵活性,请致电withOffsetSameInstant。传递常量ZoneOffset.UTC。
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;
如果您必须使用糟糕的遗留类java.util.Date,请从Instant 转换。
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。