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)    
21
user2779311 23 Dez. 2015 im 20:31

4 Antworten

Beste Antwort

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

18
Azat Nugusbayev 23 Dez. 2015 im 18:11

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.

22
wombling - Chris Paine 11 Feb. 2018 im 14:10

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)));
2
avogt 29 Mai 2018 im 07:02
//(year,month,day)

LocalDate beginDate = LocalDate.of(1899,12,31);    
LocalDate today = LocalDate.now();    
ChronoUnit.DAYS.between(beginDate, today)
3
Stephen Rauch 8 Juli 2018 im 13:40