将带时区的日期时间字符串解析为ZonedDateTime对象遇异常求助
解决Java ZonedDateTime解析带冒号时区的异常问题
我来帮你搞定这个解析异常的问题,咱们先拆解下错误原因:
核心问题分析
你的代码里有两个关键问题导致了DateTimeParseException:
时区格式符号不匹配
你用的XX格式符对应的是不带冒号的时区偏移(例如-0500),但你的输入字符串里的时区是带冒号的-05:00,这种格式需要用XXX来匹配。周年与日历年混淆
模式里的YYYY代表的是基于周的周年,这和我们日常使用的日历年(yyyy)不是同一个概念,日常解析日期应该用yyyy。
修正后的代码
把这两个问题修复后,代码就能正常运行了:
package com.example.test; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main( String[] args ) { ZoneId myTimeZone = ZoneId.of("US/Eastern"); // 修正:用yyyy替换YYYY,XXX替换XX DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssXXX"); // 输入字符串本身带时区偏移,解析时无需额外指定withZone,若要转换时区可后续处理 ZonedDateTime zdt = ZonedDateTime.parse("2019-03-07 00:05:00-05:00", dateTimeFormatter); // 如果需要转换到指定时区,可以用下面的方式 ZonedDateTime convertedZdt = zdt.withZoneSameInstant(myTimeZone); System.out.println(convertedZdt); } }
补充说明
- 输入字符串
2019-03-07 00:05:00-05:00本身已经包含了时区偏移信息,解析时DateTimeFormatter不需要额外调用withZone(myTimeZone),解析后的ZonedDateTime会自动携带该时区偏移。 - 如果你的需求是将解析后的时间转换到
US/Eastern时区,可以使用withZoneSameInstant()方法,它会保持时间戳不变,仅转换时区表示。
运行修正后的代码,你会得到类似如下的输出:
2019-03-07T00:05-05:00[US/Eastern]
内容的提问来源于stack exchange,提问作者M.E.
相关产品推荐
相关产品推荐

