Jak znaleźć różnicę w dniach między dwiema instancjami Joda-Time DateTime
? Z „różnicą dni” mam na myśli, że jeśli początek jest w poniedziałek, a koniec we wtorek, spodziewam się zwrotu 1, niezależnie od godziny / minuty / sekund daty rozpoczęcia i zakończenia.
Days.daysBetween(start, end).getDays()
daje mi 0, jeśli początek jest wieczorem i kończy się rano.
Mam również ten sam problem z innymi polami dat, więc miałem nadzieję, że będzie ogólny sposób na „zignorowanie” pól o mniejszym znaczeniu.
Innymi słowy, miesiące między lutym a 4 marca będą również wynosić 1, podobnie jak godziny między 14:45 a 15:12. Jednak różnica godzin między 14:01 a 14:55 wynosiłaby 0.
Days.daysBetween
są nieprawidłowe?Instant
, nie mówisz tylkostart.toInstant()
, prawda?Days
KlasaUżywanie
Days
klasy zwithTimeAtStartOfDay
metodą powinno działać:źródło
toDateMidnight()
typu DateTime jest przestarzała.end
jest przedstart
, czy zwraca dni negatywne?możesz użyć
LocalDate
:źródło
toDateMidnight()
typu DateTime jest przestarzała.new LocalDate(date)
ponaddate.toLocalDate()
?tl; dr
…lub…
java.time
Do Twojej wiadomości, projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time .
Odpowiednikiem Joda-Time
DateTime
jestZonedDateTime
.Najwyraźniej chcesz policzyć dni według dat, co oznacza, że chcesz zignorować porę dnia. Na przykład rozpoczęcie minuty przed północą i zakończenie minuty po północy powinno dać jeden dzień. W przypadku tego zachowania wyodrębnij
LocalDate
z plikuZonedDateTime
.LocalDate
Klasa reprezentuje wartość data-tylko bez time-of-day i bez strefy czasowej.Użyj
ChronoUnit
wyliczenia, aby obliczyć upływające dni lub inne jednostki.Ścięty
Jeśli pytasz o bardziej ogólny sposób liczenia, w którym interesuje Cię delta godzin jako godziny, a nie pełnych godzin jako przedziałów czasu wynoszących sześćdziesiąt minut, skorzystaj z tej
truncatedTo
metody.Oto twój przykład z 14:45 do 15:12 tego samego dnia.
To nie działa przez kilka dni. W tym przypadku użyj funkcji toLocalDate ().
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Zaakceptowana odpowiedź tworzy dwa
LocalDate
obiekty, które są dość drogie, jeśli czytasz dużo danych. Używam tego:Dzwoniąc
getMillis()
używasz już istniejących zmiennych.MILLISECONDS.toDays()
następnie wykorzystuje proste obliczenia arytmetyczne, nie tworzy żadnego obiektu.źródło
java.time.Period
Użyj
java.time.Period
klasy, by policzyć dni .Ponieważ Java 8 obliczanie różnicy jest bardziej intuicyjne w użyciu
LocalDate
,LocalDateTime
do przedstawienia dwóch datźródło
źródło
źródło