我试图在当前时间上增加几年。我的代码如下所示:
// ten yeas ago
int backYears = 10;
Instant instant = ChronoUnit.YEARS.addTo(Instant.now(), -backYears);
但我有一个例外:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
at java.time.Instant.plus(Instant.java:862)
当我打开该方法时,Instant.plus
我看到以下内容:
@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);
}
如您所见MONTHS
,YEARS
不受支持。但为什么?有了一个旧的java.util.Calendar
,我可以很容易地做到这一点:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.YEAR, amount);
return c.getTime();
我猜唯一的一个原因是,由于闰日 2 月 29 日,我们不知道一个月和一年中有多少天。但老实说,我们也有闰秒。因此,我认为这是一个错误,ChronoUnit
应该支持所有 s。唯一的一个问题是:我们是否需要考虑闰秒和闰日。至于我的需要,可以假设那个月有 30 天和 365 年。我不需要做类似的事情,Calendar.roll()
但这也可以满足我。