tl; dr
Instant.now()
java.time
Kelas tanggal-waktu lama yang merepotkan yang digabungkan dengan versi Java paling awal telah digantikan oleh kelas java.time yang dibangun ke dalam Java 8 dan yang lebih baru. Lihat Tutorial Oracle . Sebagian besar fungsionalitas telah di-back-port ke Java 6 & 7 di ThreeTen-Backport dan selanjutnya diadaptasi ke Android di ThreeTenABP .
Instant
Sebuah Instant
mewakili momen di garis waktu dalam UTC dengan resolusi hingga nanodetik .
Instant instant = Instant.now();
The toString
Metode menghasilkan objek String dengan teks yang mewakili nilai tanggal-waktu menggunakan salah satu standar ISO 8601 format.
String output = instant.toString();
2016-06-27T19: 15: 25.864Z
The Instant
kelas kelas bangunan-blok dasar di java.time. Ini harus menjadi kelas andalan Anda saat menangani tanggal-waktu karena umumnya praktik terbaik adalah melacak, menyimpan, dan bertukar nilai waktu-tanggal dalam UTC.
OffsetDateTime
Tetapi Instant
memiliki keterbatasan seperti tidak ada opsi pemformatan untuk menghasilkan string dalam format alternatif. Untuk fleksibilitas lebih, ubah dari Instant
menjadi OffsetDateTime
. Tentukan offset-dari-UTC . Dalam java.time itu berarti sebuah ZoneOffset
objek. Di sini kami ingin tetap menggunakan UTC (+00) sehingga kami dapat menggunakan konstanta yang sesuai ZoneOffset.UTC
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T19: 15: 25.864Z
Atau lewati Instant
kelas.
OffsetDateTime.now( ZoneOffset.UTC )
Sekarang dengan sebuah OffsetDateTime
objek di tangan, Anda dapat menggunakan DateTimeFormatter
untuk membuat objek String dengan teks dalam format alternatif. Cari Stack Overflow untuk banyak contoh penggunaan DateTimeFormatter
.
ZonedDateTime
Jika Anda ingin menampilkan waktu jam dinding untuk beberapa zona waktu tertentu, terapkan a ZoneId
untuk mendapatkan a ZonedDateTime
.
Dalam contoh ini kami menerapkan zona waktu Montréal. Di musim panas, di bawah omong kosong Daylight Saving Time (DST) , zona memiliki offset -04:00
. Jadi perhatikan bagaimana waktu hari adalah empat jam lebih awal dalam output, 15
bukan 19
jam. Instant
dan ZonedDateTime
keduanya mewakili momen serentak yang sama, hanya dilihat melalui dua lensa berbeda.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
2016-06-27T15: 15: 25.864-04: 00 [Amerika / Montreal]
Mengonversi
Meskipun Anda harus menghindari kelas tanggal-waktu lama, jika harus, Anda dapat mengonversi menggunakan metode baru yang ditambahkan ke kelas lama. Di sini kami menggunakan java.util.Date.from( Instant )
dan java.util.Date::toInstant
.
java.util.Date utilDate = java.util.Date.from( instant );
Dan pergi ke arah lain.
Instant instant= utilDate.toInstant();
Demikian pula, cari metode baru yang ditambahkan ke GregorianCalendar
(subclass dari Calendar
) untuk dikonversi ke dan dari java.time.ZonedDateTime
.
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
.
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu java.sql.*
kelas. Hibernate 5 & JPA 2.2 mendukung java.time .
Dimana mendapatkan kelas java.time?
java.util.Date
tidak pernah merupakan tanggal mesin lokal. Itu selalu didefinisikan sebagai milidetik berlalu sejak 1970-01-01 relatif terhadap UTC + 00: 00. Mungkin perilaku metodenyatoString()
membingungkan Anda yang memang menggunakan representasi di zona waktu lokal.