Why Instant does not support operations with ChronoUnit.YEARS?

后端 未结 2 665
我在风中等你
我在风中等你 2021-02-03 18:00

This was unexpected to me:

> Clock clock = Clock.systemUTC();

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


        
2条回答
  •  广开言路
    2021-02-03 18:18

    I'm taking a stab at it in what looks to me like something very logical.

    Here is the code for the method plus(long, TemporalUnit) (which is used in 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);
         }
    

    We can see that the results are calculated by multiplying seconds representation of units, a year cannot be logically and consistently represented by seconds for obvious reasons.


    Addition

    I can see another obvious reason why : constants used in the method above come from java.time.LocalTime. The constants only define units up to days. No constant above days are defined (in LocalDate and LocalDateTime neither).

提交回复
热议问题