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

时间:2018-10-17 09:28:05

标签: android datetime utc datetime-parsing threetenbp

我正在将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);

2 个答案:

答案 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