gpt4 book ai didi

Java 8 Instant.range 和 Instant.with 出现不一致

转载 作者:行者123 更新时间:2023-11-30 05:24:49 28 4
gpt4 key购买 nike

我正在尝试生成 java.time.Instant 的实例用于基于属性的测试,并使用Temporal.range几乎适用于所有 Temporal我尝试过的子类- 除了Instant ,这似乎没有提供有用的最小值和最大值。

这个简化的例子:

import java.time.Instant;
import java.time.temporal.ChronoField;

public class Main {
public static void main(String[] args) {
Instant.EPOCH.with(
ChronoField.INSTANT_SECONDS,
Instant.EPOCH.range(ChronoField.INSTANT_SECONDS).getMaximum()
);
}
}

抛出此异常:

Exception in thread "main" java.time.DateTimeException: Instant exceeds minimum or maximum instant
at java.time.Instant.create(Instant.java:411)
at java.time.Instant.with(Instant.java:718)
at Main.main(Main.java:6)

可以找到可运行的版本 here

一个简单的计数器示例是使用 LocalDate 的等效代码其行为与文档中的预期完全一致,正确处理该月的可变日期:

import java.time.LocalDate;
import java.time.temporal.ChronoField;

public class Main {
public static void main (String[] args){
for(int m = 1; m <= 12; m++) {
LocalDate startOfMonth = LocalDate.of(2019, m, 1);
LocalDate endOfMonth = startOfMonth.with(
ChronoField.DAY_OF_MONTH,
startOfMonth.range(ChronoField.DAY_OF_MONTH).getMaximum());
System.out.println(
startOfMonth.toString() + " -> " + endOfMonth.toString()
);
}
}
}

可运行版本 here

我在这里缺少什么吗?

最佳答案

ChronoField 返回的范围 defers to IsoChronology.range ,其中says :

Note that the result only describes the minimum and maximum valid values and it is important not to read too much into them. For example, there could be values within the range that are invalid for the field.

事实上,IsoChronology.INSTANCE.range(ChronoField.INSTANT_SECONDS).getMaximum() 返回的值是 Long.MAX_VALUE。它没有考虑 Instant 的限制。

实际最大值由 Instant.MAX 定义.

关于Java 8 Instant.range 和 Instant.with 出现不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58867751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com