Ich versuche, das neue Datum & amp; Zeit-API. Mein Code funktioniert bis auf die letzte Zeile:
LocalDate current=LocalDate.now();
System.out.println(current);
LocalDate personaldate=LocalDate.of(2011,Month.AUGUST, 15);
System.out.println(personaldate);
LocalDate afterten=current.plus(Period.ofDays(10));
System.out.println(afterten);
// error occurs here
System.out.println(afterten.plus(Duration.ofDays(3)));
Wenn ich versuche, eine Dauer in Tagen hinzuzufügen, wird ein Fehler generiert. Kann mir jemand helfen zu verstehen warum?
Fehler:
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds
at java.time.LocalDate.plus(LocalDate.java:1241)
at java.time.LocalDate.plus(LocalDate.java:137)
at java.time.Duration.addTo(Duration.java:1070)
at java.time.LocalDate.plus(LocalDate.java:1143)
at TestClass.main(TestClass.java:15)
4 Antworten
Eine Dauer misst eine Zeitspanne anhand zeitbasierter Werte (Sekunden, Nanosekunden). Ein Zeitraum verwendet datumsbasierte Werte (Jahre, Monate, Tage). hier ist der Link
https://docs.oracle.com/javase/tutorial/datetime/iso/period.html
Das gleiche wie in JodaTime
Obwohl die akzeptierte Antwort völlig richtig ist, suchte ich nach einer einfachen Lösung für mein Problem, als ich zu dieser Frage kam.
Bei Verwendung von Period konnte ich die Anzahl der Tage zwischen meinen beiden LocalDate-Objekten nicht zählen. (Sagen Sie mir, wie viele Jahre, Monate und Tage zwischen den beiden liegen, ja, aber nicht nur die Anzahl der Tage.)
Um das gewünschte Ergebnis zu erzielen, war es jedoch so einfach, jedem meiner Objekte die LocalDate-Methode "atStartOfDay" hinzuzufügen.
Also mein fehlerhafter Code:
long daysUntilExpiry = Duration.between(LocalDate.now(), training.getExpiryDate()).toDays();
Wurde einfach angepasst an:
long daysUntilExpiry = Duration.between(LocalDate.now().atStartOfDay(), training.getExpiryDate().atStartOfDay()).toDays();
Dadurch werden die Objekte zu LocalDateTime-Objekten, die mit Duration verwendet werden können. Da beide Objekte den Tagesbeginn als "Zeit" -Teil haben, gibt es keinen Unterschied.
Hoffe das hilft jemand anderem.
Wie bereits erwähnt, basiert die Dauer immer auf Sekunden, während die Periode den Tag als Konzept berücksichtigt. Der Code löst eine Ausnahme aus, wenn versucht wird, Sekunden zu einem LocalDate hinzuzufügen - das ebenfalls tagbasiert ist.
Wenn Sie Ihren Code wie folgt ändern, zeigt sich der Unterschied: Verwenden Sie LocalDateTime, wenn Sie innerhalb weniger Tage zu den Augenblicken gelangen:
LocalDateTime current = LocalDateTime.now();
System.out.println(current);
LocalDateTime afterten = current.plus(Period.ofDays(10));
System.out.println(afterten);
// error occurred here - but with LocalDateTime is resolved!
System.out.println(afterten.plus(Duration.ofDays(3)));
//(year,month,day)
LocalDate beginDate = LocalDate.of(1899,12,31);
LocalDate today = LocalDate.now();
ChronoUnit.DAYS.between(beginDate, today)
Verwandte Fragen
Neue Fragen
java
Java ist eine Programmiersprache auf hoher Ebene. Verwenden Sie dieses Tag, wenn Sie Probleme haben, die Sprache selbst zu verwenden oder zu verstehen. Dieses Tag wird selten alleine verwendet und wird am häufigsten in Verbindung mit [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] und [maven] verwendet.