我正在将UTC时间转换为本地时间,但遇到错误:
org.threeten.bp.format.DateTimeParseException: Text 'Wed Oct 17 06:12:19 GMT+05:30 2018' 无法在索引 20 处解析
请说出任何其他选项或修复此解决方案。
这是我的代码,请检查一下:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
String formattedDate = LocalDateTime.parse(UTC_time, formatter)
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.systemDefault())
.format(formatter);
使用这个
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
您可以使用此链接查找您的模式
首先,您的字符串似乎可能来自对老式java.util.Date
对象调用toString
。如果是这种情况,您可以看看是否可以掌握Date
对象本身并使用DateTimeUtils
(来自ThreeTenABP(进行转换,从而省去解析的所有麻烦。
其次,您的代码适用于我的台式计算机上内置的java.time,我不知道为什么它不适用于向后移植。向后移植的可能解决方法是:
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);
在我的计算机上,欧洲/哥本哈根时区的输出:
周三 10月 17 02:42:19 GMT+02:00 2018
编辑:虽然似乎没有记录向后移植支持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 偏移量。
我已经修复了代码中的另一个错误:当您解析为LocalDateTime
时,您丢失了时区或字符串中的偏移量信息,这导致您的时间出错。具体来说,当字符串中有GMT+05:30
并且您执行.atOffset(ZoneOffset.UTC)
时,时间偏差了 5 小时 30 分钟。改用OffsetDateTime
进行分析(如果区域名称的z
有效,则需要ZonedDateTime
(。
链接:org.threeten.bp:format.DateTimeFormatter
文档,包括格式模式字母