tl; dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
…atau…
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
waktu java
FYI, proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time .
Setara dengan Joda-Time DateTime
adalah ZonedDateTime
.
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
Tampaknya Anda ingin menghitung hari berdasarkan tanggal, artinya Anda ingin mengabaikan waktu dalam sehari. Misalnya, mulai satu menit sebelum tengah malam dan berakhir satu menit setelah tengah malam akan menghasilkan dalam satu hari. Untuk perilaku ini, ekstrak a LocalDate
dari Anda ZonedDateTime
. The LocalDate
kelas mewakili nilai tanggal-hanya tanpa waktu-of-hari dan tanpa zona waktu.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
Gunakan ChronoUnit
enum untuk menghitung hari yang berlalu atau unit lainnya.
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
Memotong
Adapun Anda bertanya tentang cara yang lebih umum untuk melakukan penghitungan ini di mana Anda tertarik delta jam sebagai jam-jam daripada jam lengkap sebagai rentang waktu enam puluh menit, gunakan truncatedTo
metode ini.
Ini adalah contoh Anda dari 14:45 sampai 15:12 pada hari yang sama.
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
Ini tidak berfungsi selama berhari-hari. Gunakan toLocalDate () dalam kasus ini.
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date
, Calendar
, & SimpleDateFormat
.
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time kelas .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk java.sql.*
kelas.
Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval
, YearWeek
, YearQuarter
, dan lebih .
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval
, YearWeek
, YearQuarter
, dan lebih .
Days.daysBetween
tidak benar?