Joda Time vs Java Time

19

Meskipun Joda kaya fitur dan lebih canggih dari waktu Java standar, itu mungkin tidak selalu menjadi hal terbaik untuk digunakan. Bagaimana saya memutuskan apakah saya harus menggunakan Joda Time atau Java Time dalam kode Java apa pun?

Apakah ada semacam pedoman yang memberi tahu kita cara memilih yang tepat tergantung pada persyaratan kita?

Jedi Knight
sumber
5
Dapatkan yang terbaik dari kedua dunia, dengan menggunakan API Tanggal & Waktu baru yang termasuk dalam Java 8 . Ini sangat dipengaruhi oleh Joda Time. Sebenarnya penulis utama adalah Stephen Colebourne, penulis Joda Time.
Joachim Sauer
1
@ JoachimSauer Sudahkah ini muncul di rilis final atau ini akan terjadi ketika Java 8 akan diluncurkan?
m3th0dman
@ m3th0dman: ini akan dimasukkan dalam rilis Java 8 final, belum dirilis. GA saat ini dijadwalkan untuk 2013-09-09 .
Joachim Sauer
Kelas Joda-Time dan Java tanggal-waktu asli sekarang ketinggalan zaman oleh kelas java.time dibangun ke Java 8, Java 9, dan kemudian.
Basil Bourque

Jawaban:

29

Joda Time adalah perbaikan dari perpustakaan waktu Java yang hampir selalu menjadi pilihan yang tepat, terlepas dari pengecualian berikut:

  1. Ketika sulit atau tidak diinginkan untuk menambahkan dependensi pihak ketiga ke proyek Anda

  2. Ketika penggunaannya di antarmuka publik akan menyebabkan masalah, misalnya mendapatkan ORM untuk menangani bidang waktu java dan Joda

Namun, dalam kasus 2) masih akan lebih baik untuk menggunakan Joda secara internal jika memungkinkan.

Hal-hal di atas patut diingat, tetapi harus langka. Jika ragu, pergi dengan Joda.

Robert Johnson
sumber
Tolong beri tahu saya apa artinya "gunakan Joda secara internal". Saya seorang pemula dan saya tidak tahu semua hal ini.
Jedi Knight
5
@Jedi Knight: itu berarti aplikasi menggunakan Joda untuk logikanya sendiri dan hanya mengkonversi ke / dari java.util.Date ketika berkomunikasi dengan sistem eksternal yang membutuhkannya.
Michael Borgwardt
2
Dengan 'internal', itu bisa internal ke aplikasi secara keseluruhan (seperti dalam contoh Michael), tetapi bisa internal ke kelas atau hanya metode tertentu. Katakan misalnya bahwa Anda memiliki metode utilitas yang mengambil dua objek Java Date dan menghitung jumlah hari kerja di antara mereka, tetapi itu berisi bug. Untuk memperbaikinya, mungkin lebih mudah untuk menulis ulang metode itu menggunakan JodaTime sebagai gantinya, tetapi Anda mungkin tidak dapat menyediakan waktu untuk memperbaiki semua kode yang memanggil metode, sehingga Anda membiarkan tanda tangan metode tidak berubah. Dalam hal ini Anda menggunakan Joda "internal" dalam metode itu.
Robert Johnson
FYI, proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque
13

Perhatikan bahwa di situs web Joda-Time menyatakan:

Kelas tanggal dan waktu standar sebelum Java SE 8 buruk. Dengan mengatasi masalah ini secara langsung, Joda-Time telah menjadi pustaka tanggal dan waktu de facto standar untuk Jawa. Perhatikan bahwa mulai dari Java SE 8 dan seterusnya, pengguna diminta untuk bermigrasi ke java.time (JSR-310).

Kontributor utama untuk Joda-Time , jodastephen , juga merupakan kontributor utama untuk JSR-310, seperti yang dapat dilihat pada repositori GitHub yang terkait dengan http://www.threeten.org/ . Omong-omong, jodastephen juga memiliki ...

Saya pikir aman untuk menyatakan bahwa kita dapat merasa dihibur dan aman dengan API Tanggal dan Waktu yang baru sebagaimana disediakan di Java 8 dan seterusnya.

Beberapa referensi tambahan:

YoYo
sumber
12

API tanggal standar Java rusak secara fundamental sehingga saya sering mempertimbangkan hanya menambahkan Joda Time ke ekstensi perpustakaan JVM sehingga dimuat di classpath secara default dengan Java API lainnya.

Jika Anda pernah ditugaskan untuk retrofit internasionalisasi dan zona waktu menjadi aplikasi Java yang lama dan telah mencoba menggunakan Java API standar saja, Anda akan mengerti apa yang saya maksud. Saya dapat mengubah ribuan baris kode asli menjadi kurang dari seratus. Peningkatan produktivitas tidak terbayangkan.

Lebih lanjut, API Tanggal standar tidak intuitif, di mana API Joda yang cair dapat diambil dalam beberapa jam bukan minggu. Analogi Anda mencoba untuk sampai ke pulau yang berjarak dua mil, lebih mirip dengan yang berikut ini.

1) Perahu motor yang akan membawa Anda ke pulau hanya dalam 6 menit.

Atau...

2) Sebuah rakit bambu darurat yang diikat bersama dengan tanaman merambat selama badai yang dikemudikan oleh seorang pria gila yang sahabatnya adalah bola voli.

Seperti jawaban lain telah menyatakan, beberapa kelemahan seperti ORM bahkan menjadi tidak ada karena Hibernate sekarang memiliki plugin yang memungkinkan properti kacang tipe Joda untuk dipetakan ke bidang tanggal / waktu basis data. JPA mungkin juga punya jawaban untuk ini.

Jika keinginan Anda adalah untuk aplikasi Anda untuk memiliki tapak minimalis sebagai aplikasi desktop karena berkaitan dengan ruang disk maka mungkin Java bahkan bukan pilihan bahasa yang tepat.

maple_shaft
sumber
FYI, proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque
8

Satu hal lagi: Java-Time (yaitu Date) bukan ThreadSafe tetapi JodaTime adalah. Jadi JodaTime lebih disukai ketika persyaratan suka

  • MultiThreaded Environment mengakses sumber daya bersama
  • Sinkronisasi Waktu Terpusat seperti situasi

Atau yang lain untuk aplikasi sederhana Java-Time tidak apa-apa.

Vintesh
sumber
Bahkan DateTime juga bukan ThreadSafe, bukan? Perbaiki saya jika saya salah.
vintesh
3
Sebagian besar pustaka Joda, termasuk kelas DateTime, tidak dapat diubah dan karenanya aman untuk digunakan. Namun ada beberapa kelas yang bisa berubah yang tidak aman untuk thread. Lihat joda-time.sourceforge.net/faq.html#threading .
Robert Johnson
1
Keamanan benang untuk java.timediimplementasikan melalui imutabilitas. Lihat stackoverflow.com/questions/9303532/… . Ini berfungsi baik untuk aplikasi sederhana dan kompleks. Bahkan api doc menyatakan bahwa "Semua kelas tidak dapat diubah dan aman bagi thread" (secara harfiah dikutip dari paragraf kedua). java.utilKelas - kelas lama di sisi lain memiliki beberapa masalah. Saya menyadari bahwa jawaban ini mengacu pada yang terakhir, tetapi penting untuk membuat perbedaan itu sekarang.
YoYo
Tidak mewakili waktu tanggal karena nilai yang tidak dapat diubah hanya gila. Saya tahu ini sudah diperbaiki sekarang tapi sungguh apa yang mereka pikirkan?
Aluan Haddad
2

The java.time kerangka menggantikan kedua warisan kelas tanggal-waktu dan Joda-Time

Pembaruan: Kelas tanggal-waktu lama yang dikirimkan dengan versi Java yang paling awal sekarang adalah warisan, secara resmi digantikan oleh kelas java.time yang dibangun ke dalam Java 8, Java 9, dan yang lebih baru.

Date, Calendar, SimpleDateFormat, Dan java.sql.*kelas tanggal-waktu semua harus dihindari. Tidak pernah ada kebutuhan untuk menggunakan kelas-kelas yang membingungkan, bermasalah, dan dirancang dengan buruk ini. Mereka sepenuhnya digantikan oleh kelas java.time. Satu-satunya tujuan mereka sekarang adalah untuk mempertahankan kode lama yang ada. Saat berinteraksi dengan kode lama, Anda dapat mengonversi ke / dari java.time dengan memanggil metode baru yang ditambahkan ke kelas lama. Untuk info lebih lanjut tentang konversi, lihat: Konversi java.util.Date ke tipe “java.time” apa? .

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time . Proyek Joda-Time menginspirasi kerangka java.time. Keduanya dipimpin oleh orang yang sama, Stephen Colebourne . Anda dapat menganggap java.time sebagai penulisan ulang / pendesainan ulang Joda-Time, semua kode baru tetapi menggunakan apa yang telah dipelajari selama bertahun-tahun dari membangun perpustakaan tanggal-waktu pertama yang komprehensif dan canggih di industri.

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan.

Sebagian besar fungsi java.time di-portingkan ke Java 6 & 7 di ThreeTen-Backport dan selanjutnya diadaptasi ke Android di ThreeTenABP (lihat Cara menggunakan ... ).

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 .

Basil Bourque
sumber