Joda-Time
Sedangkan untuk menambahkan dependensi, saya khawatir java.util.Date & .Calendar sangat buruk sehingga hal pertama yang saya lakukan untuk proyek baru adalah menambahkan perpustakaan Joda-Time. Di Java 8 Anda dapat menggunakan paket java.time baru, terinspirasi oleh Joda-Time.
Inti dari Joda-Time adalah DateTime
kelas. Tidak seperti java.util.Date, ia memahami zona waktu yang ditentukan ( DateTimeZone
). Saat mengkonversi dari juDate, tetapkan zona.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeQuébec = new DateTime( date , zone );
LocalDate
Salah satu cara untuk memverifikasi apakah dua kali tanggal mendarat pada tanggal yang sama adalah dengan mengonversi ke LocalDate
objek.
Konversi itu tergantung pada zona waktu yang ditetapkan. Untuk membandingkan LocalDate
objek, mereka harus dikonversi dengan zona yang sama.
Berikut ini adalah sedikit metode utilitas.
static public Boolean sameDate ( DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1 );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( dt1.getZone() ) );
Boolean match = ld1.equals( ld2 );
return match;
}
Lebih baik akan menjadi argumen lain, menentukan zona waktu daripada mengasumsikan zona waktu objek DateTime pertama harus digunakan.
static public Boolean sameDate ( DateTimeZone zone , DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1.withZone( zone ) );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( zone ) );
return ld1.equals( ld2 );
}
Representasi String
Pendekatan lain adalah membuat representasi string dari bagian tanggal setiap waktu-tanggal, kemudian membandingkan string.
Sekali lagi, zona waktu yang ditetapkan sangat penting.
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print( dateTime1 );
String s2 = formatter.print( dateTime2.withZone( dt1.getZone() ) );
Boolean match = s1.equals( s2 );
return match;
Rentang waktu
Solusi umum adalah menentukan rentang waktu, lalu tanyakan apakah rentang tersebut berisi target Anda. Contoh kode ini adalah dalam Joda-Time 2.4. Perhatikan bahwa kelas terkait "tengah malam" sudah usang. Alih-alih menggunakan withTimeAtStartOfDay
metode ini. Joda-Time menawarkan tiga kelas untuk mewakili rentang waktu dengan berbagai cara: Interval, Periode, dan Durasi.
Menggunakan pendekatan "Setengah Terbuka" di mana awal rentang mencakup inklusif dan akhir.
Zona waktu target dapat berbeda dari zona waktu interval.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime target = new DateTime( 2012, 3, 4, 5, 6, 7, timeZone );
DateTime start = DateTime.now( timeZone ).withTimeAtStartOfDay();
DateTime stop = start.plusDays( 1 ).withTimeAtStartOfDay();
Interval interval = new Interval( start, stop );
boolean containsTarget = interval.contains( target );
waktu java
Java 8 dan yang lebih baru hadir dengan kerangka java.time . Terinspirasi oleh Joda-Time, didefinisikan oleh JSR 310, dan diperpanjang oleh proyek ThreeTen-Extra. Lihat Tutorial .
Pembuat Joda-Time telah menginstruksikan kita semua untuk pindah ke java.time secepat mungkin. Sementara itu Joda-Time berlanjut sebagai proyek yang dipelihara secara aktif. Tapi berharap pekerjaan di masa depan hanya terjadi di java.time dan ThreeTen-Extra daripada Joda-Time.
Untuk meringkas java.time secara singkat ... An Instant
adalah momen di timeline di UTC. Terapkan zona waktu ( ZoneId
) untuk mendapatkan ZonedDateTime
objek. Untuk memindahkan off timeline, untuk mendapatkan ide tak terbatas kabur dari tanggal-waktu, gunakan "lokal" kelas: LocalDateTime
, LocalDate
, LocalTime
.
Logika yang dibahas di bagian Joda-Time dari Jawaban ini berlaku untuk java.time.
Kelas java.util.Date yang lama memiliki toInstant
metode baru untuk konversi ke java.time.
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
Menentukan tanggal membutuhkan zona waktu.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
Kami menerapkan objek zona waktu itu Instant
untuk mendapatkan a ZonedDateTime
. Dari itu kami mengekstrak nilai hanya tanggal (a LocalDate
) karena tujuan kami adalah membandingkan tanggal (bukan jam, menit, dll.).
ZonedDateTime zdt1 = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate1 = LocalDate.from( zdt1 );
Lakukan hal yang sama untuk java.util.Date
objek kedua yang kita butuhkan untuk perbandingan. Saya hanya akan menggunakan momen saat ini saja.
ZonedDateTime zdt2 = ZonedDateTime.now( zoneId );
LocalDate localDate2 = LocalDate.from( zdt2 );
Gunakan isEqual
metode khusus untuk menguji nilai tanggal yang sama.
Boolean sameDate = localDate1.isEqual( localDate2 );