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 Instantmewakili momen di garis waktu dalam UTC dengan resolusi hingga nanodetik .
Instant instant = Instant.now();
The toStringMetode 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 Instantkelas 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 Instantmemiliki keterbatasan seperti tidak ada opsi pemformatan untuk menghasilkan string dalam format alternatif. Untuk fleksibilitas lebih, ubah dari Instantmenjadi OffsetDateTime. Tentukan offset-dari-UTC . Dalam java.time itu berarti sebuah ZoneOffsetobjek. 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 Instantkelas.
OffsetDateTime.now( ZoneOffset.UTC )
Sekarang dengan sebuah OffsetDateTimeobjek di tangan, Anda dapat menggunakan DateTimeFormatteruntuk 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 ZoneIduntuk 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, 15bukan 19jam. Instantdan ZonedDateTimekeduanya 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.Datetidak 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.