Java tarih ve saat sınıflarını kullanmalı mıyım yoksa Joda Time gibi bir 3. taraf kitaplığına mı gitmeliyim?


147

Dünyanın her yerinden ülkelerde kullanılacak web tabanlı bir sistem oluşturuyorum. Saklanması gereken bir veri türü tarihler ve saatlerdir.

Joda saati gibi üçüncü taraf kitaplıklara kıyasla Java tarih ve saat sınıflarını kullanmanın artıları ve eksileri nelerdir? Sanırım bu üçüncü şahıs kitaplıklarının iyi bir nedeni var, ancak onları gerçekten kendim karşılaştırmadım.


5
Bazı yorumları açıklığa kavuşturmak için… Joda-Time devam ederken, halefi JSR 310: Tarih ve Saat API'sinin java.time paketi altında Java 8'in bir parçası olması planlanıyor . Oracle, bir öğretici taslağına sahiptir . JDBC 4.2 , yeni veri türlerini işleyecektir .
Basil Bourque

Yanıtlar:


197

DÜZENLEME: Java 8 yayınlandığına göre, eğer onu kullanabiliyorsanız bunu yapın! java.timebana göre Joda Time'dan bile daha temiz. Ancak, Java-8 öncesi takıldıysanız, okumaya devam edin ...

Max, Joda kullanmanın artılarını ve eksilerini sordu ...

Artıları:

  • Çok iyi çalışıyor. Joda'da standart Java kitaplıklarından çok daha az hata olduğundan şüpheleniyorum. Java kütüphanelerindeki bazı hataları, tasarım nedeniyle düzeltmek (imkansız değilse) gerçekten zordur.
  • Tarih / saat yönetimi hakkında doğru şekilde düşünmenizi teşvik etmek için tasarlanmıştır - "yerel saat" kavramını (örneğin, "beni nerede olursam olayım sabah 7'de uyandır") ve anı ("James'i arıyorum 15:00 PST; olduğu yerde saat 15:00 olmayabilir, ancak aynı anda ")
  • Ben daha kolay zaman dilimi veritabanı güncellemeyi kolaylaştırır inanıyoruz yapar değişikliği nispeten sık
  • Hayatı IME'yi çok daha kolay hale getiren iyi bir değişmezlik hikayesine sahiptir .
  • Değişmezlikten yola çıkan tüm biçimlendiriciler iş parçacığı açısından güvenlidir, bu harika çünkü neredeyse her zaman uygulama aracılığıyla tek bir biçimlendiriciyi yeniden kullanmak istersiniz.
  • java.timeEn azından biraz benzer oldukları için Java 8'de öğrenmeye bir adım önde başlayacaksınız.

Eksileri:

  • Öğrenilmesi gereken başka bir API (dokümanlar oldukça iyi olsa da)
  • Oluşturulacak ve dağıtılacak başka bir kitaplık
  • Java 8 kullandığınızda, becerilerinizi taşımak için hala bazı işler var
  • DateTimeZoneBuilderGeçmişte etkili bir şekilde kullanmadım . Bu çok nadir bir kullanım durumudur.

Oxbow_lakes'in kendi küçük API'nizi etkili bir şekilde oluşturma fikrine yanıt vermek için, işte bunun neden kötü bir fikir olduğuna dair görüşlerim:

  • Çalışıyor. Zaten sizin için yapıldığında neden çalışıyorsunuz?
  • Ekibinize yeni gelen biri, kendi geliştirdiğiniz API'nizden çok Joda'ya aşina olma olasılığı daha yüksektir
  • En basit kullanımların ötesinde herhangi bir şey için muhtemelen yanlış anlarsınız ... ve başlangıçta yalnızca basit işlevselliğe ihtiyacınız olduğunu düşünseniz bile , bu şeylerin her seferinde küçük bir parça olmak üzere daha karmaşık hale gelme alışkanlığı vardır. Tarih ve saat manipülasyonunun doğru şekilde yapılması zordur . Dahası, yerleşik Java API'lerinin doğru şekilde kullanılması zordur - sadece takvim API'sinin tarih / saat aritmetiğinin nasıl çalıştığına ilişkin kurallara bakın. Başlamak için iyi tasarlanmış bir kitaplık kullanmak yerine bunların üzerine herhangi bir şey inşa etmek kötü bir fikirdir.

5
@adi: Güncellendi - hala geçerli, ancak umarım JSR-310 Java 8'in bir parçası olacak, ancak Java 7'nin bir parçası değildi.
Jon Skeet

2
@JonSkeet Bu muhtemelen java-8 girmesinden bu yana güncellenmelidir
Sionnach733

@ Sionnach733: Hepsini güncellemeyeceğim, ancak başlangıçta bir şeyler ekleyeceğim.
Jon Skeet

2
java.time.*Java 6 ve 7 için bir arka port var
Miscreant

24

Java 8'i beklemeyi düşünmüyorsanız, tarih ve saati değiştirmek için daha iyi bir API uygulayacaklarını umuyorsanız , evet, lütfen Joda-Time'ı kullanın . Zaman kazandırır ve birçok baş ağrısını önler.


Lehte ve aleyhte olanlar? Joda zamanını hiç kullanmadım - insanların bu konuda ne sevdiğini duymak ilginç olurdu.
Max Stewart

15

Cevap: duruma göre değişir

JODA (ve JSR-310), birden çok takvim sistemiyle kullanım desteği içeren, tam işlevli bir tarih / saat kitaplığıdır.

Şahsen, JODA'yı ihtiyacım olan şey için karmaşıklık açısından çok uzak bir adım olarak buldum. Standart java Dateve Calendarsınıflardaki 2 ana (IMHO) hatası şunlardır:

  1. Değiştirilebilirler
  2. Anında-Zamanında Bir Yıl-Ay-Gün kavramını karıştırırlar

Bunlar JODA tarafından ele alınsa da, her ikisi de gerçek "takvimsel" hesaplamalar için kaputun altındaki java sınıflarını kullanan YearMonthDayve kendi sınıflarınızı oluşturmayı oldukça kolay bulacaksınız Instant. O zaman 100'den fazla sınıftan oluşan bir API, farklı bir biçimlendirme / ayrıştırma mekanizması vb. Hakkında bilgi sahibi olmanıza gerek kalmaz.

Elbette, farklı kronolojilerin (örneğin İbranice) tam temsiline ihtiyacınız varsa veya kendi hayali Takvim sisteminizi tanımlayabilmeyi istiyorsanız (örneğin, yazdığınız bir oyun için), o zaman belki JODA veya JRS-310 tam size göre. Değilse, o zaman kendi başınıza atmanın muhtemelen gitmenin yolu olduğunu öneririm.

JSR-310 spesifikasyon lideri, JODA'yı 1. sırada yazan Stephen Colebourne'dur, bu yüzden mantıksal olarak JODA'nın yerini alacaktır.


16
gerektiğini değil IMO olmayan uzmanlar tarafından yeniden çıkarılabilir.
Jon Skeet

6
Ben de moron değilim, ancak Java D&T API'leriyle ilgili hala sorunlar yaşıyorum. Kötüye kullanımı acı verici derecede kolaydır. İnsanların Joda'yı doğru şekilde kullanma olasılığının daha yüksek olmasının nedeni, Joda'nın daha iyi tasarlanmış olmasıdır - bu sizi doğru şeyi yapmaya teşvik eder .
Jon Skeet

6
Tarih / saat API'leri söz konusu olduğunda haftanın herhangi bir gününde kendime bir uzmana güveniyorum. Bu, başka kimsenin kullanmadığı rastgele bir 3. parti API değil. "> 100 sınıf" argümanı sapıktır çünkü hepsini öğrenmeniz gerekmiyor.
Jon Skeet

5
Sanırım farklı olmayı kabul etmemiz gerekecek. Uzmanlar tarafından yazılmış ve iyi tasarlanmış, zaman aritmiyle kirli işler yapmak zorunda kalmamı engelleyen herhangi bir güvenilir tarih / saat , benim açımdan "olması gerekenler" olarak kabul edilir. Geçen yıl insan zaman ölçümünden büyük bir tutkuyla nefret etmeyi öğrendim.
Jon Skeet

5
Joda varken kendi oyununuzu oynamak çok kötü bir fikirdir. Sadece yapma. Joda'nın kullanmayacağınız düzinelerce sınıf olduğu doğru, ancak bunun cevabı oldukça basit - ihtiyacınız olmayanları kullanmayın. Bu türden kendi kitaplığınızı yazarken yanlış gidebilecek pek çok şey var - hem geliştirme hem de test aşamasında harcayacağınız çaba miktarı çok büyük. Veya sadece bir kitaplık ekleyebilirsiniz. Daha sonra, Joda, ekibinize yeni katılanların daha önce kullanmış olabileceği, ancak kendi geliştirdiğiniz kitaplığınızı kullanmamış olabileceği ek bir avantaja sahiptir.
Dawood ibn Kareem

7

Her şey tarihlerle ne yaptığına bağlı. Onları basitçe sürdürüyorsanız, Java'nın yerleşik Tarihler'i muhtemelen istediğiniz her şeyi yapacaktır. Bununla birlikte, kapsamlı zaman tarihi manipülasyonu yapıyorsanız, muhtemelen Joda ile daha iyi durumda olursunuz.


7

Bir Joda-Time kitaplığı kullanmalısınız, çünkü:

  1. Joda-Time, standart bir
    tarih gösterimi yöntemi olan ISO 8601 standardını destekler .
  2. Joda-Time'da gün / ay / yıl eklemek ve çıkarmak java.util.date'e göre daha kolaydır.
  3. Verme tarihine göre başlatma, Joda-Time'da çok daha kolaydır.
  4. Joda-Time, saat dilimini de destekler.
  5. Joda-Time daha iyi bir yerleşik ayrıştırmaya sahiptir. Hata olarak "2014-02-31" gibi yanlış bir tarih atılır:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Daha fazla ayrıntı için bu sayfayı beğenebilirsiniz: http://swcodes.blogspot.com/

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.