gpt4 book ai didi

java - 为什么 Instant 不支持 ChronoUnit.YEARS 的操作?

转载 作者:IT老高 更新时间:2023-10-28 21:09:12 36 4
gpt4 key购买 nike

这出乎我的意料:

> Clock clock = Clock.systemUTC();

> Instant.now(clock).minus(3, ChronoUnit.DAYS);
java.time.Instant res4 = 2016-10-04T00:57:20.840Z

> Instant.now(clock).minus(3, ChronoUnit.YEARS);
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years

作为一种解决方法,我必须这样做:

> Instant.now(clock).atOffset(ZoneOffset.UTC).minus(3, ChronoUnit.YEARS).toInstant();
java.time.Instant res11 = 2013-10-07T01:02:56.361Z

我很好奇 Instant 为什么不支持 YEARS。开发者就放弃了吗?

(在我的实际代码中,我尝试减去 Period.ofYears(3) 但引用的 Instant 方法是最后被调用的方法)。

最佳答案

我正在尝试一些在我看来非常合乎逻辑的东西。

这是 plus(long, TemporalUnit) 方法的代码(在 minus(...) 中使用):

@Override
public Instant plus(long amountToAdd, TemporalUnit unit) {
if (unit instanceof ChronoUnit) {
switch ((ChronoUnit) unit) {
case NANOS: return plusNanos(amountToAdd);
case MICROS: return plus(amountToAdd / 1000_000, (amountToAdd % 1000_000) * 1000);
case MILLIS: return plusMillis(amountToAdd);
case SECONDS: return plusSeconds(amountToAdd);
case MINUTES: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_MINUTE));
case HOURS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_HOUR));
case HALF_DAYS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_DAY / 2));
case DAYS: return plusSeconds(Math.multiplyExact(amountToAdd, SECONDS_PER_DAY));
}
throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
}
return unit.addTo(this, amountToAdd);
}

我们可以看到,结果是用单位的秒表示来计算的,一年不能用秒表示,原因很明显。


加法

我可以看到另一个明显的原因:上述方法中使用的常量来自 java.time.LocalTime。常量只定义最多天的单位。以上天数没有定义(在 LocalDateLocalDateTime 中也没有)。

关于java - 为什么 Instant 不支持 ChronoUnit.YEARS 的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907925/

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