Java 8中如何将long+TimeUnit组合转换为Duration实例?
解决方案
你不需要手写冗长的switch分支做单位映射,Java 8下可以直接用TimeUnit内置的纳秒转换方法实现,无精度损失,代码非常简洁:
static Duration convert(long dur, TimeUnit timeUnit) { return Duration.ofNanos(timeUnit.toNanos(dur)); }
实现说明
- 所有
TimeUnit定义的时间单位(纳秒、微秒、毫秒、秒、分、时、天)都是纳秒的整数倍,转换到纳秒不会出现精度丢失问题 TimeUnit.toNanos(long)方法本身在数值溢出时会抛出ArithmeticException,和你手写switch调用Duration.ofDays/ofHours等工厂方法的异常行为完全一致,没有兼容风险- 语义完全匹配:
TimeUnit.DAYS是固定24小时的时长单位,和Duration.ofDays()对“天”的定义完全一致,不存在时区、夏令时导致的逻辑偏差 - 注意不要用转毫秒的实现(比如
Duration.ofMillis(timeUnit.toMillis(dur))),这种写法在处理小于毫秒粒度的时长时会丢失精度。
如果后续升级到Java 9及以上版本,可以直接使用JDK内置的官方API timeUnit.toDuration(dur) 替换上述自定义方法,行为完全一致。
内容的提问来源于stack exchange,提问作者Adam Kotwasinski
相关产品推荐
相关产品推荐

