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

How to fix org.threeten.bp.format.DateTimeParseException?

提问人:Bala sundar k 提问时间:10/17/2018 最后编辑:AnonymousBala sundar k 更新时间:10/23/2018 访问量:4333

问:

我正在将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);
android datetime utc datetime-解析 threetenbp

评论

4赞 Radesh 10/17/2018
共享您的代码
0赞 Bala sundar k 10/17/2018
DateTimeFormatter 格式化程序 = DateTimeFormatter.ofPattern(“EEE MMM dd HH:mm:ss z yyyy”, Locale.ENGLISH);字符串 formattedDate = LocalDateTime.parse(UTC_time, 格式化程序) .atOffset(ZoneOffset.UTC) .atZoneSameInstant(ZoneId.systemDefault()) .format(格式化程序);
0赞 Bala sundar k 10/17/2018
这是我的代码,请检查一下。
1赞 Amessihel 10/17/2018
最好将你的(格式良好且整洁的)代码嵌入到你的问题正文中(我刚刚编辑了它)。
0赞 Anonymous 10/17/2018
有趣的是,在向后移植中,我得到了一个像你这样的例外,但提到的索引是 23(它说的地方),而不是 20(它说的地方)。+05:30GMT

答:

1赞 Radesh 10/17/2018 #1

使用这个

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

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

评论

1赞 Amessihel 10/17/2018
奇怪,根据项目页面区域名称:这将输出时区 ID 的显示名称。如果字母数为 1、2 或 3,则输出短名称。如果字母数为 4,则输出全名。五个或更多字母引发 IllegalArgumentException。如果是这样,或者是一样的。zzzz
0赞 Amessihel 10/17/2018
明白了,相关部分是(见这个 SO 答案)。Locale.ENGLISH
0赞 Radesh 10/17/2018
@Amessihel让我们知道怎么做
0赞 Bala sundar k 10/23/2018
我正在尝试这个,它不受我的代码影响。它还返回 org.threeten.bp.format.DateTimeParseException:文本“Mon Oct 22 14:15:27 GMT+05:30 2018”无法在索引 20 处解析
1赞 Anonymous 10/17/2018 #2

首先,你的字符串似乎可能来自对一个老式对象的调用。如果是这种情况,您可以看看是否可以控制对象本身并使用(来自ThreeTenABP)进行转换,并省去所有解析的麻烦。toStringjava.util.DateDateDateTimeUtils

其次,您的代码适用于我台式计算机上内置的 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

编辑:虽然似乎没有记录到向后移植支持格式模式字母,但上述内容适用于我 Mac 上的 ThreeTen 向后移植 1.3.6。记录的替代方法是格式模式的以下变体:O

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss 'GMT'xxx yyyy", Locale.ROOT);

如果您更喜欢时区缩写,例如 GMT 偏移量,您可以使用原始格式化程序将格式化回字符串。诀窍是,在格式模式中解析,并且通常具有GMT或UTC偏移量的样式。CESTOOOOGMT+05:30

我修复了您代码中的另一个错误:当您解析为 时,您丢失了字符串中的时区或偏移量信息,这导致您的时间错误。具体来说,当字符串中出现并且您这样做时,时间将 5 小时 30 分钟偏差。请改用 an 进行解析(如果 for zone name 有效,则需要 )。LocalDateTimeGMT+05:30.atOffset(ZoneOffset.UTC)OffsetDateTimezZonedDateTime

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

评论

0赞 Bala sundar k 10/23/2018
它对我不起作用......我得到错误是java.lang.IllegalArgumentException:未知模式字符“O”
0赞 Anonymous 10/23/2018
对不起,我错过了这个重要的细节:向后移植不支持模式字母。还有其他可能的解决方案,也许不那么优雅。我会再想一想,然后回到这里。O
0赞 Bala sundar k 10/23/2018
嘿,我需要更好的解决方案将UTC时间转换为本地时间...请说以节省我的日子......
0赞 Anonymous 10/23/2018
我相信我已经解决了,@Balasundark。请看我的编辑。
0赞 Bala sundar k 10/23/2018
我正在删除这样的时区(2018 年 10 月 23 日星期二 11:41:26)......我的代码工作正常。