Java:为DateTimeFormatter添加时区时抛出异常问题排查
LocalDateTime用"z"格式化抛异常?原因和解决办法来了!
嘿,我来帮你搞懂这个问题!你想用DateTimeFormatter的模式键z给时间加上时区名称,比如输出11:59:22 PM GMT,结果运行代码直接抛了DateTimeException,核心问题其实出在你用错了时间类!
为啥会报错?
LocalDateTime这个类本身是不带任何时区信息的——它只记录了年、月、日、时、分、秒这些日期时间字段,完全没有时区偏移或者时区ID的属性。而模式符z的作用是格式化时区名称,这就要求被格式化的对象必须包含时区相关的数据,不然系统没办法提取到时区值,自然就抛出了Unable to extract value: class java.time.LocalDateTime这个异常。
你看你的代码:
public class TimeZone { public static void main(String[] args) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss a z"); System.out.println(now.format(formatter)); } }
now这个LocalDateTime对象里根本没有时区数据,格式化时找不到对应的值,报错是必然的。
怎么解决?
要实现你要的带时区名称的输出,得用包含时区信息的时间类,比如ZonedDateTime或者OffsetDateTime,这里推荐用ZonedDateTime,它能完整记录时区ID和名称。
修改后的代码示例:
public class TimeZone { public static void main(String[] args) { // 获取带系统默认时区的当前时间 ZonedDateTime now = ZonedDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss a z"); System.out.println(now.format(formatter)); // 如果想指定特定时区(比如你想要的GMT),可以这么写 ZonedDateTime gmtNow = ZonedDateTime.now(ZoneId.of("GMT")); System.out.println(gmtNow.format(formatter)); } }
运行这段代码就能输出类似11:59:22 PM GMT或者你本地时区的名称啦!
额外小提示
- 模式符
z对应时区名称(如GMT、CET、Asia/Shanghai) - 如果需要输出时区偏移(比如
+02:00),可以用X或x - 永远记住:
LocalDateTime是“无时区”的时间类,涉及到时区的操作一定要用带时区的时间类哦!
内容的提问来源于stack exchange,提问作者Herr.Roehrig
相关产品推荐
相关产品推荐

