ZonedDateTime解析失败:是否使用了错误的日期格式?
解析带纳秒的UTC时间戳到ZonedDateTime报错
我尝试将时间戳"26-JUL-23 10.01.51.336231000 AM UTC"解析为ZonedDateTime对象,代码如下:
ZonedDateTime.parse("26-JUL-23 10.01.51.336231000 AM UTC", formatter)
但持续抛出错误:
java.time.format.DateTimeParseException: Text '26-JUL-23 10.01.51.336231000 AM UTC' could not be parsed...
我尝试使用如下DateTimeFormatter,但问题未解决:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yy hh.mm.ss.SSSSSS a z")
请问是不是日期格式用错了?
问题原因与解决办法
你的格式字符串存在两个关键问题:
- 纳秒格式符不匹配:时间戳里的
336231000是9位纳秒,而你使用的SSSSSS仅能匹配6位微秒,需要改为SSSSSSSSS来适配9位纳秒。 - 时区标识解析问题:
z格式符对UTC这类时区ID的兼容性较差,建议改用V(标准时区ID格式符);同时必须指定英文Locale,否则默认Locale非英文时无法识别JUL这类英文月份缩写。
修正后的代码如下:
// 指定英文Locale确保月份解析正确,同时匹配9位纳秒和UTC时区 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yy hh.mm.ss.SSSSSSSSS a V", Locale.ENGLISH); ZonedDateTime zdt = ZonedDateTime.parse("26-JUL-23 10.01.51.336231000 AM UTC", formatter);
补充说明:
hh是12小时制格式符,配合a(上午/下午标识)的用法是正确的,无需修改。- 如果你的运行环境默认Locale已经是英文,Locale参数可以省略,但显式指定能避免跨环境问题。
内容的提问来源于stack exchange,提问作者Catherine S.
相关产品推荐
相关产品推荐

