Java Duration的最大值是多少?

17

我尝试使用Duration.ofMillis(Long.MAX_VALUE)在Java 8中创建最大持续时间,但出现了长整型溢出的错误。 如果存在Duration.MAX_VALUE,我该如何以编程方式获取其等效值?

编辑:长整型溢出可能是由于尝试在值上进行添加而不是在构造期间进行。对于没有可重现代码的情况表示抱歉。

3个回答

15

简单:

Duration maxDur = ChronoUnit.FOREVER.getDuration();

1
哇,不知道这个存在,绝对是我很久以前一直在寻找的东西。 - Novaterata
被定义为 FOREVER("永远", Duration.ofSeconds(Long.MAX_VALUE, 999_999_999)),并且被记录为 "... 这个单位的预估持续时间是人为定义的,即 Duration 支持的最大持续时间。" - user85421

9

看起来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秒。

2
秒数可以为负,因此应为 Long.MIN_VALUE..LONG.MAX_VALUE - jhamon
7
那个时间段相当于大约2920亿年。 - Tuupertunut
虽然这确实会产生最高的java.time.Duration,但java.time已经使用ChronoUnit.FOREVER提供了这个功能。请参见我的简明回答 - Nick J. R. T.

8
根据Javadoc文件:
这个持续时间使用纳秒分辨率,最大值为可以保存在长整型中的秒数。
持续时间的范围需要存储一个比长整型更大的数字。为了实现这一点,该类存储一个表示秒数的长整型和一个表示秒内纳秒的整数,其值始终在0到999,999,999之间。这个模型是有方向的,意味着持续时间可能是负数。

2
那么为什么 Long.MAX_VALUE 会导致溢出?秒部分允许的最大值是多少? - Novaterata
5
好的,我刚刚尝试了这段代码:Duration test = Duration.ofMillis(Long.MAX_VALUE);,但我没有遇到溢出。你能展示一下会抛出异常的代码吗? - jhamon
抱歉,我不再拥有它了。你知道,可能是后来添加了一些东西导致的。 - Novaterata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接