тл; д-р
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
… Або…
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
java.time
FYI, проект Joda-Time зараз перебуває в режимі обслуговування , команда радить перейти до класів java.time .
Еквівалент Joda-Time DateTime
- це ZonedDateTime
.
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
Мабуть, ви хочете рахувати дні за датами, тобто ви хочете ігнорувати час доби. Наприклад, починаючи хвилину до півночі і закінчуючи хвилину після півночі, це повинно призвести до одного дня. Для такої поведінки витягніть LocalDate
зі свого ZonedDateTime
. LocalDate
Клас являє собою дату тільки значення без часу доби і без часового поясу.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
Використовуйте ChronoUnit
перерахунок, щоб обчислити минулі дні чи інші одиниці.
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
Обрізати
Що стосується того, щоб ви запитали про більш загальний спосіб зробити цей підрахунок там, де вас цікавить дельта годин як годинна година, а не повна година, як тривалість шістдесяти хвилин, скористайтеся truncatedTo
методом.
Ось ваш приклад з 14:45 до 15:12 того ж дня.
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
Це не працює днями. Використовуйте toLocalDate () у цьому випадку.
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date
, Calendar
, і SimpleDateFormat
.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*
заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .
Days.daysBetween
це неправильно?