我正在将UTC时间转换为本地时间,并且遇到错误:
org.threeten.bp.format.DateTimeParseException:文本'10月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);
答案 0 :(得分:1)
使用此
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
您可以使用此link查找图案
答案 1 :(得分:1)
首先,您的字符串似乎来自调用老式toString
对象上的java.util.Date
。在这种情况下,您可能会发现是否可以握住Date
对象本身并使用DateTimeUtils
(来自ThreeTenABP)对其进行转换,从而省去了解析的麻烦。
第二,您的代码可与台式机上内置的java.time一起使用,并且我不知道为什么它不适用于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
编辑:虽然似乎没有证据表明该反向端口支持O
格式的模式字母,但以上内容在Mac上的ThreeTen Backport 1.3.6上仍然有效。已记录的替代方法是格式模式的以下变体:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss 'GMT'xxx yyyy", Locale.ROOT);
如果您喜欢GMT偏移量之类的时区缩写,例如CEST
,则可以使用原始格式器将其格式化回字符串。诀窍是格式格式中的OOOO
解析GMT+05:30
,并且这种样式通常是GMT或UTC偏移量。
我已经修复了您代码中的另一个错误:当您解析为LocalDateTime
时,您丢失了时区或字符串中的偏移量信息,从而导致时间错误。具体来说,当字符串中包含GMT+05:30
并且您执行了.atOffset(ZoneOffset.UTC)
时,时间减少了5小时30分钟。改为使用OffsetDateTime
进行解析(如果区域名称使用z
,则需要ZonedDateTime
)。
链接: Documentation of org.threeten.bp:format.DateTimeFormatter
including the format pattern letters