提问人:Bala sundar k 提问时间:10/17/2018 最后编辑:AnonymousBala sundar k 更新时间:10/23/2018 访问量:4333
如何修复org.threeten.bp.format.DateTimeParseException?
How to fix 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);
您可以使用此链接查找您的模式
评论
z
zzz
首先,你的字符串似乎可能来自对一个老式对象的调用。如果是这种情况,您可以看看是否可以控制对象本身并使用(来自ThreeTenABP)进行转换,并省去所有解析的麻烦。toString
java.util.Date
Date
DateTimeUtils
其次,您的代码适用于我台式计算机上内置的 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偏移量的样式。CEST
OOOO
GMT+05:30
我修复了您代码中的另一个错误:当您解析为 时,您丢失了字符串中的时区或偏移量信息,这导致您的时间错误。具体来说,当字符串中出现并且您这样做时,时间将 5 小时 30 分钟偏差。请改用 an 进行解析(如果 for zone name 有效,则需要 )。LocalDateTime
GMT+05:30
.atOffset(ZoneOffset.UTC)
OffsetDateTime
z
ZonedDateTime
链接:org.threeten.bp:format 的文档。DateTimeFormatter
,包括格式模式字母
评论
O
评论
+05:30
GMT