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

Android 如何修复org.threeten.bp.format.DateTimeParseException?,android,datetime,utc,datetime-parsing,threetenbp,Android,Datetime,Utc,Datetime Parsing,Threetenbp,我正在将UTC时间转换为本地时间,我遇到了错误: org.threeten.bp.format.DateTimeParseException:文本“Wed Oct 17” 无法在索引20处解析06:12:19 GMT+05:30 2018' 请说出任何其他选项或修复此解决方案 这是我的代码,请检查: DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy", Locale.

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

org.threeten.bp.format.DateTimeParseException:文本“Wed Oct 17” 无法在索引20处解析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);
用这个

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+2018年02:00

EDIT:虽然似乎没有文件证明backport支持
O
格式模式字母,但上述内容在Mac上的Three-Ten 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
有效,则需要
zoneDateTime


链接:

共享您的codeDateTimeFormatter formatter=DateTimeFormatter.of模式(“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);这是我的代码,请检查一下。最好将你的(格式良好且整洁的)代码嵌入到你的问题正文中(我刚刚编辑了它)。有趣的是,在后台我得到了一个与你类似的例外,但提到的索引是23(其中显示
+05:30
),而不是20(其中显示
GMT
)。奇怪,根据:区域名称:输出时区ID的显示名称。如果字母计数为1、2或3,则输出短名称。如果字母数为4,则输出全名。五个或五个以上的字母会引发IllegalArgumentException。如果是这样,
z
zzz
是相同的。明白了,相关部分是
Locale.ENGLISH
(请参阅)。@amesshiel告诉我们我是如何尝试的,它不会影响我的代码。它还返回org.threeten.bp.format.DateTimeParseException:Text“Mon-Oct 22 14:15:27 GMT+05:30 2018”无法在索引20处解析它不适用于我。。。我得到的错误是java.lang.IllegalArgumentException:未知模式字符'O'对不起,我错过了这个重要的细节:后端口不支持模式字母
O
。还有其他可能的解决方案,也许不那么优雅。“我会再考虑一下,然后再回到这里。嘿,我需要更好的解决方案来将UTC时间转换为本地时间……请说,为了节省我的时间……我相信我已经解决了这个问题,@Balasandark。”。请查看我的编辑。我正在删除这样的时区(2018年10月23日星期二11:41:26)…我的代码运行良好。