tl; dr
LocalDate.of( 1985 , 1 , 1 )
…atau…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Detail
Kelas java.util.Date
,, java.util.Calendar
dan java.text.SimpleDateFormat
kelas dilarikan terlalu cepat ketika Java pertama kali diluncurkan dan berkembang. Kelas tidak dirancang atau diimplementasikan dengan baik. Perbaikan telah dicoba, dengan demikian penghinaan yang Anda temukan. Sayangnya upaya perbaikan sebagian besar gagal. Anda harus menghindari kelas-kelas ini sama sekali. Mereka digantikan di Java 8 dengan kelas baru.
Masalah dalam Kode Anda
Java.util.Date memiliki tanggal dan porsi waktu. Anda mengabaikan porsi waktu dalam kode Anda. Jadi kelas Date akan mengambil awal hari seperti yang ditentukan oleh zona waktu default JVM Anda dan menerapkan waktu itu ke objek Date. Jadi hasil dari kode Anda akan bervariasi tergantung pada mesin mana yang beroperasi atau zona waktu yang ditetapkan. Mungkin bukan yang Anda inginkan.
Jika Anda hanya menginginkan tanggal, tanpa bagian waktu, seperti tanggal lahir, Anda mungkin tidak ingin menggunakan Date
objek. Anda mungkin ingin menyimpan hanya serangkaian tanggal, dalam format ISO 8601YYYY-MM-DD
. Atau gunakan LocalDate
objek dari Joda-Time (lihat di bawah).
Joda-Time
Hal pertama yang harus dipelajari di Java: Hindari kelas java.util.Date & java.util.Calendar yang terkenal bermasalah yang dibundel dengan Java.
Sebagaimana dicatat dengan benar dalam jawaban oleh user3277382 , gunakan paket Joda-Time atau java.time baru . * Di Java 8.
Contoh Kode dalam Joda-Time 2.3
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Dump untuk menghibur ...
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Saat dijalankan ...
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
waktu java
Dalam hal ini kode untuk java.time hampir identik dengan Joda-Time .
Kami mendapatkan zona waktu ( ZoneId
), dan membangun objek tanggal-waktu yang ditugaskan ke zona waktu itu ( ZonedDateTime
). Kemudian menggunakan pola Objek Immutable , kami membuat tanggal-waktu baru berdasarkan instan objek yang sama (hitungan nanodetik sejak zaman ) tetapi menetapkan zona waktu lainnya. Terakhir kami mendapatkan LocalDate
yang tidak memiliki zona waktu atau zona waktu, meskipun memperhatikan zona waktu berlaku ketika menentukan tanggal tersebut (hari yang baru tiba lebih awal di Oslo daripada di New York misalnya).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
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 kelas java.time .
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 .