tl; dr
myJavaUtilDate // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant() // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate() // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) ) // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.
java.time
Anda menggunakan kelas tanggal-waktu lama yang mengerikan yang telah diganti bertahun-tahun yang lalu oleh kelas java.time modern yang ditentukan di JSR 310.
Date
➙ Instant
A java.util.Date
mewakili momen dalam UTC. Penggantinya adalah Instant
. Panggil metode konversi baru yang ditambahkan ke kelas lama.
Instant instant = myJavaUtilDate.toInstant() ;
Zona waktu
Tentukan zona waktu yang Anda inginkan untuk waktu-of-hari Anda yang baru.
Tentukan nama zona waktu yang tepat dalam format Continent/Region
, seperti America/Montreal
, Africa/Casablanca
, atau Pacific/Auckland
. Jangan pernah menggunakan singkatan 2-4 huruf seperti EST
atau IST
karena itu bukan zona waktu yang sebenarnya, tidak terstandarisasi, dan bahkan tidak unik (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime
Terapkan ZoneId
ke Instant
untuk mendapatkan a ZonedDateTime
. Momen yang sama, titik yang sama di garis waktu, tetapi waktu jam dinding yang berbeda.
ZonedDateTime zdt = instant.atZone( z ) ;
Mengubah waktu hari
Anda meminta untuk mengubah waktu hari. Terapkan a LocalTime
untuk mengubah semua bagian waktu hari: jam, menit, detik, pecahan detik. Yang baru ZonedDateTime
dibuat instance-nya, dengan nilai-nilai berdasarkan aslinya. The java.time kelas menggunakan ini objek abadi pola untuk menyediakan benang-keselamatan .
LocalTime lt = LocalTime.of( 15 , 30 ) ; // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ;
Momen pertama hari ini
Tapi Anda meminta secara khusus untuk 00:00. Jadi rupanya Anda menginginkan momen pertama hari itu. Hati-hati: beberapa hari di beberapa zona tidak dimulai pada 00:00:00. Mereka mungkin mulai pada waktu lain seperti 01:00:00 karena anomali seperti Daylight Saving Time (DST).
Biarkan java.time menentukan momen pertama. Ekstrak bagian khusus tanggal. Kemudian lewati zona waktu untuk mendapatkan momen pertama.
LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;
Sesuaikan dengan UTC
Jika Anda perlu kembali ke UTC, ekstrak file Instant
.
Instant instant = zdtFirstMomentOfDay.toInstant() ;
Instant
➙ Date
Jika Anda membutuhkan java.util.Date
untuk beroperasi dengan kode lama yang belum diperbarui ke java.time , ubah.
java.util.Date d = java.util.Date.from( instant ) ;