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
相关产品推荐
相关产品推荐

