Saya berasal dari dunia C #, jadi belum terlalu berpengalaman dengan Java. Saya baru saja diberitahu oleh Eclipse yang Date
sudah usang:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
Mengapa? Dan apa (terutama dalam kasus seperti di atas) yang harus digunakan?
java
date
deprecated
Svish
sumber
sumber
Jawaban:
Date
Konstruktor tertentu sudah usang, danCalendar
harus digunakan sebagai gantinya. TheJavaDoc
untuk Tanggal menjelaskan konstruktor yang usang dan bagaimana untuk menggantikan mereka menggunakanCalendar
.sumber
java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .The
java.util.Date
kelas tidak benar-benar usang, hanya konstruktor yang, bersama dengan beberapa konstruktor lain / metode yang usang. Itu sudah usang karena penggunaan semacam itu tidak bekerja dengan baik dengan internasionalisasi. TheCalendar
kelas harus digunakan sebagai gantinya:Lihatlah tanggal Javadoc:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
sumber
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
kelas adalah pilihan yang lebih baik ... jika Anda mengubah kode Anda.tl; dr
…atau…
Detail
Kelas
java.util.Date
,,java.util.Calendar
danjava.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 gunakanLocalDate
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
Dump untuk menghibur ...
Saat dijalankan ...
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 mendapatkanLocalDate
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).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 .sumber
Salah satu alasan mengapa konstruktor tidak digunakan adalah bahwa makna parameter tahun bukanlah yang Anda harapkan. Javadoc mengatakan:
Perhatikan bahwa bidang tahun adalah jumlah tahun sejak itu
1900
, jadi kode sampel Anda kemungkinan besar tidak akan melakukan apa yang Anda harapkan. Dan itu intinya.Secara umum,
Date
API hanya mendukung kalender barat modern, memiliki komponen yang ditentukan khusus, dan berperilaku tidak konsisten jika Anda menetapkan bidang.The
Calendar
danGregorianCalendar
API lebih baik dariDate
, dan pihak ke-3 Joda-time API umumnya dianggap yang terbaik. Di Java 8, mereka memperkenalkanjava.time
paket - paket tersebut, dan ini sekarang merupakan alternatif yang direkomendasikan.sumber
Saya menemukan pertanyaan ini sebagai duplikat dari pertanyaan yang lebih baru yang menanyakan apa cara non-usang untuk mendapatkan
Date
pada tahun, bulan, dan hari tertentu.Jawaban di sini sejauh ini mengatakan untuk menggunakan
Calendar
kelas, dan itu benar sampai Java 8 keluar. Tetapi pada Java 8, cara standar untuk melakukan ini adalah:Dan kemudian jika Anda benar-benar membutuhkannya
java.util.Date
, Anda dapat menggunakan saran-saran dalam pertanyaan ini .Untuk info lebih lanjut, lihat API atau tutorial untuk Java 8.
sumber
Harap dicatat bahwa tidak
Calendar.getTime()
ditentukan dalam arti bahwa bagian waktu hari default ke waktu saat ini.Untuk mereproduksi, coba jalankan kode berikut beberapa kali:
Output misalnya:
Menjalankan kode yang sama persis beberapa menit kemudian menghasilkan:
Jadi, sementara
set()
memaksa bidang terkait untuk mengoreksi nilai, ia membocorkan waktu sistem untuk bidang lainnya. (Diuji di atas dengan Sun jdk6 & jdk7)sumber
Date
itu sendiri tidak ditinggalkan. Hanya saja banyak metodenya. Lihat di sini untuk detailnya .Gunakan
java.util.Calendar
sebagai gantinya.sumber
Sebagian besar pengembang Java saat ini menggunakan paket pihak ketiga Joda-Time . Secara luas dianggap sebagai implementasi yang jauh lebih baik.
Namun Java 8 akan memiliki paket java.time. * Baru . Lihat artikel ini, Memperkenalkan API Tanggal dan Waktu Baru untuk JDK 8 .
sumber
Karena konstruktor Tanggal sudah tidak digunakan lagi, Anda dapat mencoba kode ini.
sumber
Date
danCalendar
pada 2019 adalah saran yang buruk.Mirip dengan apa yang disarankan binnyb, Anda dapat mempertimbangkan menggunakan Kalender yang lebih baru> metode GregorianCalendar. Lihat dokumen terbaru ini:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
sumber
Anda dapat membuat metode seperti
new Date(year,month,date)
dalam kode Anda dengan menggunakanCalendar
kelas.Ini akan berfungsi seperti konstruktor yang sudah usang
Date
sumber
Instant
danZonedDateTime
.Tanggal konstruktor mengharapkan tahun dalam format tahun sejak 1900, bulan berbasis nol, hari berbasis satu, dan menetapkan jam / menit / detik / milidetik ke nol.
Jadi menggunakan penggantian Kalender (tahun berbasis nol, bulan berbasis nol, hari berbasis satu) untuk konstruktor Tanggal yang sudah tidak digunakan lagi, kita memerlukan sesuatu seperti:
Atau menggunakan Java 1.8 (yang memiliki tahun berbasis nol, dan bulan dan hari berbasis satu):
Berikut adalah versi yang sama dari Tanggal, Kalender, dan Java 1.8:
sumber
(cara pra-Jawa-8)
sumber