我试图在当前时间添加几年。我的代码如下所示:java.time.Instant.plus(long amountToAdd,TemporalUnit unit)不受支持的单位
// 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();
的原因只有一个,我想那是什么,我们不知道有多少天,一个月,一年,因为闰日29二月 但要说实话,我们也有一个leap second。 因此,我认为这是一个错误,应该支持所有的ChronoUnit
。 唯一的问题是:我们是否需要考虑闰秒和闰日。 至于我的需要没关系,只是假设该月有30天和365年。 我不需要像Calendar.roll()
这样的东西,但这也可以满足我。
我没有设计课程,所以我无法确定。我认为从毫微秒到数天的单位可以明确地转换为秒和毫微秒(忽略闰秒,因为几乎所有计算机都忽略它们),因此得到支持。像“ZonedDateTime”,“OffsetDateTime”和“LocalDateTime”这样的类知道如何处理数月和数年,因此使用它们来添加这样的单位。 –