Wie finde ich den Unterschied in Tagen zwischen zwei Joda-Time- DateTime
Instanzen? Mit 'Differenz in Tagen' meine ich, wenn Start am Montag und Ende am Dienstag ist, erwarte ich einen Rückgabewert von 1, unabhängig von der Stunde / Minute / Sekunde des Start- und Enddatums.
Days.daysBetween(start, end).getDays()
gibt mir 0, wenn der Start am Abend ist und am Morgen endet.
Ich habe auch das gleiche Problem mit anderen Datumsfeldern, daher hatte ich gehofft, dass es eine generische Möglichkeit gibt, die Felder von geringerer Bedeutung zu ignorieren.
Mit anderen Worten, die Monate zwischen Februar und dem 4. März wären ebenso 1 wie die Stunden zwischen 14:45 und 15:12 Uhr. Der Stundenunterschied zwischen 14:01 und 14:55 wäre jedoch 0.
Days.daysBetween
sind, dass sie falsch sind?Instant
, sprechen Sie nicht nur darüberstart.toInstant()
, oder?Days
KlasseDie Verwendung der
Days
Klasse mit derwithTimeAtStartOfDay
Methode sollte funktionieren:quelle
toDateMidnight()
vom Typ DateTime veraltet.end
vor dem iststart
, gibt es negative Tage zurück?Sie können verwenden
LocalDate
:quelle
toDateMidnight()
vom Typ DateTime veraltet.new LocalDate(date)
über verwendendate.toLocalDate()
?tl; dr
…oder…
java.time
Zu Ihrer Information , das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time .
Das Äquivalent von Joda-Time
DateTime
istZonedDateTime
.Anscheinend möchten Sie die Tage nach Datum zählen, was bedeutet, dass Sie die Tageszeit ignorieren möchten. Wenn Sie beispielsweise eine Minute vor Mitternacht beginnen und eine Minute nach Mitternacht enden, sollte dies zu einem einzigen Tag führen. Extrahieren
LocalDate
Sie für dieses Verhalten ein aus IhremZonedDateTime
. DieLocalDate
Klasse repräsentiert einen Nur-Datum-Wert ohne Tageszeit und ohne Zeitzone.Verwenden Sie die
ChronoUnit
Aufzählung, um die verstrichenen Tage oder andere Einheiten zu berechnen.Kürzen
Wenn Sie nach einer allgemeineren Methode für diese Zählung fragen, bei der Sie das Delta der Stunden als Stunde und nicht die vollständigen Stunden als Zeitspanne von 60 Minuten interessieren, verwenden Sie die
truncatedTo
Methode.Hier ist Ihr Beispiel von 14:45 bis 15:12 am selben Tag.
Dies funktioniert seit Tagen nicht mehr. Verwenden Sie in diesem Fall toLocalDate ().
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
Die akzeptierte Antwort erstellt zwei
LocalDate
Objekte, die ziemlich teuer sind, wenn Sie viele Daten lesen. Ich benutze das:Beim Aufruf verwenden
getMillis()
Sie bereits vorhandene Variablen.MILLISECONDS.toDays()
verwendet dann eine einfache arithmetische Berechnung, erstellt kein Objekt.quelle
java.time.Period
Verwenden Sie die
java.time.Period
Klasse, um Tage zu zählen .Da die Berechnung der Differenz in Java 8 intuitiver
LocalDate
istLocalDateTime
, werden die beiden Daten dargestelltquelle
quelle
quelle