You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中获取Duration微秒数的更优雅实现方式探讨

优雅获取Duration微秒数的方法

嘿,这个问题确实戳中了Java Duration API的一个小细节——直接调用get(ChronoUnit.MICROS)会抛异常,因为Duration内部仅原生支持SECONDS和NANOS这两个单位,其他单位如果不属于它的"支持列表"就会报错。不过确实有比手动从纳秒转换更优雅的方式,分两种场景来说:

场景1:使用Java 9及以上版本

Java 9给Duration新增了to(TemporalUnit)方法,专门用来将Duration转换为指定单位的数值,用起来简洁又直观:

final Duration twoSeconds = Duration.ofSeconds(2);
final long microseconds = twoSeconds.to(ChronoUnit.MICROS);
System.out.println(microseconds); // 输出2000000

这个方法内部会自动处理单位转换逻辑,不需要自己手动计算,完全符合"优雅"的要求。

场景2:使用Java 8版本

如果还在维护Java 8的项目,也可以借助ChronoUnit的convert方法来实现,它能直接处理TemporalAmount类型的转换:

final Duration twoSeconds = Duration.ofSeconds(2);
final long microseconds = ChronoUnit.MICROS.convert(twoSeconds);
System.out.println(microseconds); // 同样输出2000000

这个写法的可读性比toNanos() / 1000L高很多,也避免了手动计算可能带来的失误。

补充:为什么直接get()会失败?

简单说下背景:Duration的get(TemporalUnit)方法仅允许获取它内部存储的原生单位(SECONDS和NANOS),或者是能通过这两个单位精确组合出来的单位(比如MILLIS,因为1秒=1000毫秒,纳秒可以整除1e6转成毫秒)。而MICROS在Java 8的Duration设计中并没有被纳入直接支持的范围,所以调用get(ChronoUnit.MICROS)会抛出UnsupportedTemporalTypeException。

内容的提问来源于stack exchange,提问作者Guillaume Robbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:22:33