为什么Instant不支持使用ChronoUnit.YEARS进行操作?
这对我来说意外:
> 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
。 常量仅定义单位为天。 没有定义常数以上的天数(在LocalDate
和LocalDateTime
也没有)。