Ich versuche einige Jahre zur aktuellen Zeit hinzuzufügen. Mein Code sieht so aus:java.time.Instant.plus (long amountToAdd, Unit TemporalUnit) Nicht unterstützte Einheit
// ten yeas ago
int backYears = 10;
Instant instant = ChronoUnit.YEARS.addTo(Instant.now(), -backYears);
Aber ich habe eine Ausnahme:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years
at java.time.Instant.plus(Instant.java:862)
Wenn ich die Methode geöffnet Instant.plus
Ich sehe die folgenden:
@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);
}
Wie Sie MONTHS
und YEARS
sehen werden nicht unterstützt. Aber warum? Mit einer alten java.util.Calendar
kann ich das einfach tun:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.YEAR, amount);
return c.getTime();
Der einzige Grund, was ich denke, ist, dass wir nicht wissen, wie viele Tage in einem Monat und Jahr wegen des Schalttag 29 Februar Aber Seien Sie ehrlich, wir haben auch eine leap second. Also ich denke das ist ein Bug und alle ChronoUnit
s sollten unterstützt werden. Die einzige Frage ist: müssen wir Schaltsekunde und Schalttag berücksichtigen. Für meine Bedürfnisse ist es okay, nur davon auszugehen, dass der Monat 30 Tage und Jahr 365 hat. Ich muss nicht so etwas wie Calendar.roll()
machen, aber das kann mich auch befriedigen.
Ich habe die Klasse nicht entworfen, also kann ich nicht sicher sagen. Ich denke, dass die Einheiten von Nanos bis zu Tagen eindeutig in Sekunden und Nanos umgewandelt werden können (wobei Schaltsekunden ignoriert werden, weil fast alle Computer sie ignorieren) und daher unterstützt werden. Klassen wie 'ZonedDateTime',' OffsetDateTime' und 'LocalDateTime' wissen, wie man mit Monaten und Jahren umgeht, also verwende sie zum Hinzufügen solcher Einheiten. –