1

我正在将 UTC 时间转换为当地时间,但我遇到了错误:

org.threeten.bp.format.DateTimeParseException:无法在索引 20 处解析文本“Wed Oct 17 06:12:19 GMT+05:30 2018”

请说出任何其他选项或修复此解决方案..

这是我的代码,请检查:

    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);
4

2 回答 2

1

用这个

DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);

您可以使用此链接找到您的模式

于 2018-10-17T09:52:43.017 回答
1

首先,您的字符串似乎来自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);

如果您更喜欢CESTGMT 偏移量之类的时区缩写,则可以使用原始格式化程序将其格式化回字符串。诀窍在于,OOOO在格式模式解析GMT+05:30和这种风格的 GMT 或 UTC 偏移量中。

我已经修复了您代码中的另一个错误:当您解析为 aLocalDateTime时,您丢失了字符串中的时区或偏移信息,这导致您的时间错误。具体来说,当GMT+05:30字符串中有 并且您执行了.atOffset(ZoneOffset.UTC)时,时间减少了 5 小时 30 分钟。改为使用OffsetDateTimefor 解析(如果zfor 区域名称有效,您将需要 a ZonedDateTime)。

链接: 包含格式模式字母的文档org.threeten.bp:format.DateTimeFormatter

于 2018-10-17T13:28:35.010 回答