【发布时间】:2016-11-08 17:42:58
【问题描述】:
我尝试使用 Duration.ofMillis(Long.MAX_VALUE) 在 Java 8 中创建最大持续时间,但出现了长时间溢出。 如果 Duration.MAX_VALUE 存在,我将如何以编程方式获得它的等价物?
编辑:长溢出可能是由于尝试添加值而不是在构造期间引起的。抱歉没有可重现的代码。
【问题讨论】:
标签: java java-8 max java-7 duration
我尝试使用 Duration.ofMillis(Long.MAX_VALUE) 在 Java 8 中创建最大持续时间,但出现了长时间溢出。 如果 Duration.MAX_VALUE 存在,我将如何以编程方式获得它的等价物?
编辑:长溢出可能是由于尝试添加值而不是在构造期间引起的。抱歉没有可重现的代码。
【问题讨论】:
标签: java java-8 max java-7 duration
根据Javadoc:
持续时间使用纳秒分辨率,最大值为可以长时间保持的秒数。
duration 的范围需要存储一个大于 long 的数字。为了实现这一点,该类存储了一个表示秒的 long 和一个表示纳秒的 int,它始终介于 0 和 999,999,999 之间。该模型具有定向持续时间,这意味着持续时间可能为负数。
【讨论】:
Duration test = Duration.ofMillis(Long.MAX_VALUE);我没有溢出。你能显示引发异常的代码吗?
看起来Duration 以秒(最多Long.MAX_VALUE)和纳秒(最多999,999,999)为单位存储。那么可能的最大持续时间是:
Duration d = Duration.ofSeconds(Long.MAX_VALUE, 999_999_999);
当我打印它 (System.out.print(d)) 时,我得到以下信息:
PT2562047788015215H30M7.999999999S
这意味着:2562047788015215 小时 30 分钟和 7.999999999 秒。
【讨论】:
Long.MIN_VALUE..LONG.MAX_VALUE
ChronoUnit.FOREVER。见我的succinct answer。
简单:
Duration maxDur = ChronoUnit.FOREVER.getDuration();
【讨论】:
FOREVER("Forever", Duration.ofSeconds(Long.MAX_VALUE, 999_999_999)) 并记录为“...此单元的估计持续时间被人为定义为Duration 支持的最大持续时间。”