首先,您的字符串似乎来自toString
对老式java.util.Date
对象的调用。如果是这种情况,您可能会查看是否可以抓住Date
对象本身并使用DateTimeUtils
(来自 ThreeTenABP)进行转换,并省去解析的所有麻烦。
其次,您的代码适用于我台式计算机上的内置 java.time,我不知道为什么它不适用于 backport。backport 的一个可能的修复方法是:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss OOOO yyyy", Locale.ENGLISH);
String inputString = "Wed Oct 17 06:12:19 GMT+05:30 2018";
String formattedDate = OffsetDateTime.parse(inputString, formatter)
.atZoneSameInstant(ZoneId.systemDefault())
.format(formatter);
System.out.println(formattedDate);
在我位于欧洲/哥本哈根时区的电脑上,输出:
2018 年 10 月 17 日星期三 02:42:19 GMT+02:00
编辑:虽然似乎没有记录 backport 支持O
格式模式字母,但上述内容适用于我的 Mac 上的 ThreeTen Backport 1.3.6。记录的替代方案是格式模式的以下变体:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss 'GMT'xxx yyyy", Locale.ROOT);
如果您更喜欢CEST
GMT 偏移量之类的时区缩写,则可以使用原始格式化程序将其格式化回字符串。诀窍在于,OOOO
在格式模式解析GMT+05:30
和这种风格的 GMT 或 UTC 偏移量中。
我已经修复了您代码中的另一个错误:当您解析为 aLocalDateTime
时,您丢失了字符串中的时区或偏移信息,这导致您的时间错误。具体来说,当GMT+05:30
字符串中有 并且您执行了.atOffset(ZoneOffset.UTC)
时,时间减少了 5 小时 30 分钟。改为使用OffsetDateTime
for 解析(如果z
for 区域名称有效,您将需要 a ZonedDateTime
)。
链接: 包含格式模式字母的文档org.threeten.bp:format.DateTimeFormatter