【问题标题】:What is the Maximum value for Java DurationJava Duration 的最大值是多少
【发布时间】:2016-11-08 17:42:58
【问题描述】:

我尝试使用 Duration.ofMillis(Long.MAX_VALUE) 在 Java 8 中创建最大持续时间,但出现了长时间溢出。 如果 Duration.MAX_VALUE 存在,我将如何以编程方式获得它的等价物?

编辑:长溢出可能是由于尝试添加值而不是在构造期间引起的。抱歉没有可重现的代码。

【问题讨论】:

    标签: java java-8 max java-7 duration


    【解决方案1】:

    根据Javadoc

    持续时间使用纳秒分辨率,最大值为可以长时间保持的秒数。

    duration 的范围需要存储一个大于 long 的数字。为了实现这一点,该类存储了一个表示秒的 long 和一个表示纳秒的 int,它始终介于 0 和 999,999,999 之间。该模型具有定向持续时间,这意味着持续时间可能为负数。

    【讨论】:

    • 那么为什么 Long.MAX_VALUE 会导致溢出呢? Seconds 部分允许的最大值是多少?
    • 好吧,我刚刚尝试了这段代码:Duration test = Duration.ofMillis(Long.MAX_VALUE);我没有溢出。你能显示引发异常的代码吗?
    • 我不再拥有它,抱歉。你知道的,它一定是后来添加了一些东西造成的。
    【解决方案2】:

    看起来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
    • 这个持续时间相当于大约 2920 亿年。
    • 虽然这确实产生了最高的 java.time.Duration,但 java.time 已经提供了 ChronoUnit.FOREVER。见我的succinct answer
    【解决方案3】:

    简单:

    Duration maxDur = ChronoUnit.FOREVER.getDuration();
    

    【讨论】:

    • 哇,不知道这存在,绝对是我在回溯时寻找的东西
    • 定义为 FOREVER("Forever", Duration.ofSeconds(Long.MAX_VALUE, 999_999_999)) 并记录为“...此单元的估计持续时间被人为定义为Duration 支持的最大持续时间。”
    猜你喜欢
    • 2015-05-21
    • 2011-06-15
    • 2021-12-25
    • 2011-05-05
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多