如何修复org.threeten.bp.format.DateTimeParseException?



我正在将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文档,包括格式模式字母

相关内容

  • 没有找到相关文章

最新更新