Joda Saati ve Java Saati Karşılaştırması


19

Joda, standart Java süresinden daha zengin ve daha sofistike olmasına rağmen, her zaman kullanılacak en iyi şey olmayabilir. Herhangi bir Java kodunda Joda Time veya Java Time kullanmam gerekip gerekmediğine nasıl karar verebilirim?

Gereksinimlerimize bağlı olarak doğru olanı nasıl seçeceğimizi söyleyen bir tür kılavuz var mı?


5
Java 8'de bulunan yeni Tarih ve Saat API'sını kullanarak her iki dünyanın en iyisini elde edin . Joda Time'dan çok etkileniyor. Aslında ana yazar Joda Time'ın yazarı Stephen Colebourne'dur.
Joachim Sauer

1
@JoachimSauer Son bir sürümde ortaya çıktı mı yoksa Java 8 başlatıldığında bu olacak mı?
m3th0dman

@ m3th0dman: Son Java 8 sürümüne dahil edilecek, henüz yayınlanmadı. GA şu anda 2013-09-09 için planlanıyor .
Joachim Sauer

Hem Joda-Time hem de orijinal Java tarih-saat sınıfları artık Java 8, Java 9 ve sonraki sürümlerinde yerleşik olan java.time sınıfları tarafından geride bırakılmıştır .
Basil Bourque

Yanıtlar:


29

Joda Time, Java zaman kitaplığı üzerinde böyle bir gelişmedir, aşağıdaki istisnalar dışında neredeyse her zaman doğru seçimdir:

  1. Projenize üçüncü taraf bağımlılıkları eklemek zor veya istenmeyen durumlarda

  2. Genel arayüzde kullanımı sorunlara neden olduğunda, örneğin hem OR hem de Joda zaman alanlarını işlemek için bir ORM almak

Bununla birlikte, 2) durumunda, mümkünse Joda'yı dahili olarak kullanmak daha iyi olacaktır.

Yukarıdaki şeyler akılda tutulmaya değer, ancak nadir olmalıdır. Şüpheniz varsa, Joda ile gidin.


Lütfen "Joda'yı dahili olarak kullan" ın ne anlama geldiğini söyle. Ben bir acemiyim ve tüm bunları bilmiyorum.
Jedi Knight

5
@Jedi Knight: Bu, uygulamanın kendi mantığı için Joda'yı kullandığı ve yalnızca onu gerektiren bir harici sistemle iletişim kurduğunda java.util.Date'e dönüştüğü anlamına gelir.
Michael Borgwardt

2
'İç' ile, bir bütün olarak uygulamanın içinde olabilir (Michael'ın örneğinde olduğu gibi), ancak bir sınıfın veya sadece belirli bir yöntemin içinde olabilir. Örneğin, iki Java Date nesnesi alan ve aralarındaki iş günü sayısını hesaplayan bir yardımcı yönteminiz olduğunu, ancak bir hata içerdiğini varsayalım. Düzeltmek için, bunun yerine JodaTime kullanarak bu yöntemi yeniden yazmak çok daha kolay olabilir, ancak yöntemi çağıran tüm kodu yeniden düzenleme zamanını alamayabilirsiniz, böylece yöntem imzasını değiştirmeden bırakırsınız. Bu durumda, Joda'yı bu yöntemde "dahili olarak" kullanırsınız.
Robert Johnson

FYI, Joda-Time projesi şu anda bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Oracle'ın Öğreticisine bakın .
Basil Bourque

13

Üzerine unutmayın Joda-Time devletler web:

Java SE 8'den önceki standart tarih ve saat sınıfları zayıf. Bu sorunla başa çıkarak Joda-Time, Java için fiili standart tarih ve saat kütüphanesi haline geldi. Java SE 8'den itibaren, kullanıcıların java.time (JSR-310) sürümüne geçmeleri istendiğini unutmayın.

Ana katkıda Joda-Time , jodastephen üzerinde görüldüğü gibi, aynı zamanda JSR-310 için katkıda bulunan temel kaynak olan GitHub depo ile bağlantılı http://www.threeten.org/ . Bu arada, jodastephen de bir SO sapı var ...

Java 8'den sonraki yeni Tarih ve Saat API'sı ile rahat ve güvenli hissedebileceğimizi belirtmenin güvenli olduğunu düşünüyorum .

Bazı ek referanslar:


12

Java standart tarih API'si o kadar temelde kırılmış ki, genellikle JVM'nin kütüphane uzantılarına Joda Time eklemeyi düşündüm, böylece Java API'nin geri kalanıyla varsayılan olarak sınıfyoluna yüklendi.

Uluslararasılaştırmayı ve saat dilimlerini eski bir Java uygulamasına uyarlamakla görevlendirildiyseniz ve yalnızca standart Java API'sını kullanmaya çalıştınız, ne demek istediğimi anlayacaksınız. Döndüm başardı binlerce yüz daha az bir kod eşekçe hatlarının. Verimlilik artışı düşünülemez.

Ayrıca standart Date API sezgisel değildir, burada akışkan Joda API haftalar değil saatler içinde alınabilir. İki mil ötedeki adaya gitmeye çalışma benzetmeniz aşağıdakilere daha çok benziyor.

1) Sadece 6 dakikada sizi adaya götürecek bir motorlu tekne.

Veya...

2) En iyi arkadaşı voleybol olan çılgın bir adamın yönettiği bir kasırga sırasında üzümlerle birbirine bağlanan derme çatma bir bambu sal.

Diğer cevapların belirttiği gibi, Hibernate artık Joda tipi fasulye özelliklerinin veritabanı tarih / saat alanlarına eşlenmesine izin veren eklentilere sahip olduğundan, ORM gibi birkaç dezavantaj mevcut değildir. JPA'nın da buna bir cevabı olabilir.

Arzunuz uygulamanızın disk alanı ile ilgili olduğu için masaüstü uygulaması olarak minimalist bir ayak izine sahip olması ise, belki de Java doğru dil seçimi değildir.


FYI, Joda-Time projesi şu anda bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Oracle'ın Öğreticisine bakın .
Basil Bourque

8

Bir nokta daha var: Java-Time (ie Date) ThreadSafe değil JodaTime. Bu nedenle JodaTime,

  • Ortak kaynaklara erişen MultiThreaded Ortam
  • Durumlar gibi Merkezi Zaman Senkronizasyonu

Ya da basit uygulamalar için Java-Time iyidir.


DateTime bile ThreadSafe değil, değil mi? Yanlış gidersem düzelt.
Mart'ta vintesh

3
DateTime sınıfı da dahil olmak üzere Joda kütüphanesinin büyük çoğunluğu değişmezdir ve bu nedenle iş parçacığı açısından güvenlidir. Ancak, iş parçacığı için güvenli olmayan birkaç değiştirilebilir sınıf vardır. Bkz. Joda-time.sourceforge.net/faq.html#threading .
Robert Johnson

1
İçin iplik güvenliği java.timedeğişmezlik yoluyla uygulanır. Bkz. Stackoverflow.com/questions/9303532/… . Bu, hem basit hem de karmaşık uygulamalar için iyi çalışır. Api dokümanı bile "Tüm sınıfların değişmez ve iş parçacığı açısından güvenli olduğunu" belirtir (kelimenin tam anlamıyla ikinci paragrafta alıntılanmıştır). java.utilÖte yandan eski sınıfların çeşitli sorunları var. Bu cevabın ikincisine atıfta bulunduğunu, ancak şimdi bu ayrımı yapmak için önemli olduğunu anlıyorum.
YoYo

Tarih saatlerini değişmez değerler olarak göstermemek deliliktir. Şimdi düzeltildiğini biliyorum ama gerçekten dünyada ne düşünüyorlardı?
Aluan Haddad

2

Java.time çerçevesi yerine hem eski tarih-saat sınıfları ve Joda-Time

Güncelleme: Java'nın en eski sürümleriyle birlikte gönderilen eski tarih-saat sınıfları artık eski olup, resmi olarak Java 8, Java 9 ve sonraki sürümlere yerleşik java.time sınıflarıyla desteklenmektedir .

Date, Calendar, SimpleDateFormatVe java.sql.*tarih-saat sınıfları tüm kaçınılmalıdır. Bu kafa karıştırıcı, zahmetli, kötü tasarlanmış sınıfları kullanmaya asla gerek yoktur. Bunlar tamamen java.time sınıflarıyla değiştirilir. Şimdi tek amaçları mevcut eski kodları korumaktır. Eski kodla arayüz oluştururken, eski sınıflara eklenen yeni yöntemleri çağırarak java.time dizinine / java.time biçimine dönüştürebilirsiniz. Dönüştürme hakkında daha fazla bilgi için, bkz. Java.util.Date'i hangi “java.time” türüne dönüştürme? .

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor . Joda-Time projesi java.time çerçevesine ilham verdi. Her ikisi de aynı adam Stephen Colebourne tarafından yönetiliyor . Java.time'ı, endüstrinin ilk kapsamlı ve sofistike tarih-saat kütüphanesini oluştururken yıllar boyunca öğrenilenleri kullanarak, Joda-Time'ın yeniden yazılması / yeniden tasarlanması olarak düşünebilirsiniz.

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın.

Çok java.time işlevselliği Java 6 ve 7 geri-taşındıktan ThreeTen-backport ve daha fazla adapte Android içinde ThreeTenABP (bkz ... nasıl kullanılır ).

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.