tl; dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
…lub…
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
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
jest ZonedDateTime
.
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
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 pliku ZonedDateTime
. LocalDate
Klasa reprezentuje wartość data-tylko bez time-of-day i bez strefy czasowej.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
Użyj ChronoUnit
wyliczenia, aby obliczyć upływające dni lub inne jednostki.
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
Ś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.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );
long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );
1
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
, i SimpleDateFormat
.
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 .
Days.daysBetween
są nieprawidłowe?