Sangat sering saya menemukan umpan balik negatif tentang Java Date
dan kelas terkait waktu lainnya. Sebagai pengembang .NET, saya tidak dapat sepenuhnya (tanpa menggunakannya) memahami, apa yang sebenarnya salah dengan mereka.
Adakah yang bisa menjelaskan hal ini?
Jawaban:
Ah,
Date
kelas Java . Mungkin salah satu contoh terbaik tentang bagaimana tidak melakukan sesuatu dalam bahasa apa pun, di mana pun. Dimana saya memulai?Membaca JavaDoc mungkin membuat orang berpikir bahwa para pengembang sebenarnya memiliki beberapa ide bagus. Itu berlangsung tentang perbedaan antara UTC dan GMT panjang lebar, meskipun fakta bahwa perbedaan antara kedua pada dasarnya lompatan detik (yang terjadi cukup jarang ).
Namun, keputusan desain benar-benar menyia-nyiakan pikiran untuk menjadi API yang dirancang dengan baik. Berikut beberapa kesalahan favorit:
null
. Hasilnya, kita punya 0..11 (dan hari ini menjadi bulan 11 dari tahun 109). Ada jumlah yang serupa dari ++ dan - pada bulan untuk mengonversi ke string.Calendar
, yang dirancang untuk 'memperbaiki' ini, sebenarnya membuat kesalahan yang sama. Mereka masih bisa berubah.Date
mewakili aDateTime
, tetapi untuk menangguhkan yang ada di tanah SQL, ada subkelas lainjava.sql.Date
, yang mewakili satu hari (meskipun tanpa zona waktu yang terkait dengannya).TimeZone
yang terkait dengan aDate
, sehingga rentang (seperti 'sepanjang hari') sering kali direpresentasikan sebagai tengah malam-tengah malam (sering kali di beberapa zona waktu arbitrer)Akhirnya, perlu dicatat bahwa detik kabisat umumnya mengoreksi diri terhadap jam sistem yang baik yang diperbarui dengan ntp dalam waktu satu jam (lihat tautan di bawah). Kemungkinan sistem masih aktif dan berjalan dalam pengenalan dua detik kabisat (minimal setiap enam bulan, setiap beberapa tahun secara praktis) sangat kecil kemungkinannya, terutama mengingat fakta bahwa Anda harus menerapkan ulang versi baru kode Anda dari waktu ke waktu . Bahkan menggunakan bahasa dinamis yang meregenerasi kelas atau sesuatu seperti mesin WAR akan mencemari ruang kelas dan akhirnya kehabisan permgen.
sumber
JSR 310 , yang menggantikan kelas tanggal-waktu lama dengan java.time di Java 8, membenarkan dirinya sendiri di JSR asli sebagai berikut:
sumber
getMonth()
berbasis nol, berbasisgetYear()
1900 (yaitu, tahun 2009 direpresentasikan sebagai 109).Date
kelas.sumber
Saya rasa untuk Anda ... sebagai mantan programmer .NET, saya mengajukan pertanyaan yang sama, waktu API di .NET (rentang waktu, operator overloading) sangat nyaman.
Pertama, untuk membuat tanggal tertentu, Anda menggunakan API yang sudah tidak digunakan lagi, atau:
Untuk mengurangi hari Anda melakukan hal-hal jahat seperti
atau lebih buruk
Untuk mengetahui berapa lama waktu berlalu antara dua tanggal (dalam hari / minggu / bulan) ... itu menjadi lebih buruk
Namun DateUtils dari apache (
org.apache.commons.lang.time.DateUtils
) menawarkan beberapa metode yang nyaman dan saya menemukan diri saya hanya menggunakannya belakangan iniSeperti yang ditulis Brabster, Joda Time juga merupakan pustaka eksternal yang bagus, tetapi apache tampaknya lebih "umum" daripada yang lainnya ...
sumber
Period
danDuration
kelas untuk menghitung dan mewakili waktu yang telah berlalu pada skala tahun-bulan-hari dan jam-menit-detik masing-masing.Sejujurnya, saya menemukan Java's Date API dapat digunakan. Sebagian besar masalah yang saya telah melihat dan mendengar tentang berhubungan dengan bertele-tele, kebutuhan untuk melibatkan beberapa kelas untuk melakukan sesuatu yang berguna (
Calendar
,Date
,DateFormat
/SimpleDateFormat
) dan kurangnya accesor sederhana sepertigetDayOfWeek()
.Joda Time adalah API alternatif yang dihormati di Java, dan di bagian Why Joda Time memberikan beberapa argumen lagi mengapa ini adalah alternatif yang layak yang mungkin menarik.
sumber