SORU
8 Temmuz 2014, Salı


8 Tarih Saat arasındaki farklar Java API (java.zaman ve Joda-Zaman

Sorular java.util.Date Joda-Zaman ile ilgili olduğunu biliyorum. Ama bazı kazma sonra, java.time API (Java 8, JSR 310 ile tanımlanan yeni) Joda-Time arasındaki farklar hakkında bir konu bulamadım.

8. java Java duydum.zaman API çok daha temiz ve Joda-Zaman çok daha fazlasını yapabilir. Ama örnekler iki karşılaştırarak bulun.

  • Java ne olabilir.zaman Zaman Joda bunu yapamaz mı?
  • Java ne olabilir.zaman Joda-Zaman daha iyi?
  • Performansı daha iyi, java ile.zaman?

CEVAP
8 Temmuz 2014, Salı


Ortak özellikler

a) her İki kitaplıkları değişmez tipleri kullanın. Joda-Zaman da MutableDateTime gibi ek değişken türleri bulunmaktadır.

b) Ayrıca: her İki kitaplıkları ilham ile tasarım çalışması "TimeAndMoney" from Eric Evans ya da fikir Martin Fowler about domain driven style çok çalışıyoruz, daha fazla veya daha az bir fluent programming style (gerçi her zaman mükemmel ;-)).

c) her iki kitaplıkları İle gerçek bir takvim tarihi tipi (LocalDate) denilen, gerçek duvar saati türü (LocalTime denir) ve kompozisyon (LocalDateTime denir). Eski java.util.Calendar java.util.Date ile karşılaştırıldığında çok büyük bir kazanç.

d) her İki kitaplıkları yöntem merkezli bir yaklaşım kullanıcı get(DAY_OF_YEAR) yerine getDayOfYear() kullanmak için teşvik anlamı kullanın. Bu java.util.Calendar ile karşılaştırıldığında ekstra yöntemler bir çok ikinci tip-güvenli hiç değer vermez aşırı kullanımına bağlı olmamasına rağmen) neden olur.

Performans

@OO7 diğer cevapları, Madde 3 (özel durum yakalama) muhtemelen eski - this JDK-bug bakın olmasına rağmen Mikhail Vorontsov analizi için işaret bakın. Farklı performans (genel iyilik JSR-310) esas nedeniyle aslında o kadar iç uygulama Joda-Time her zaman kullanıma makinesi-zaman-uzun-ilkel (milisaniye cinsinden).

Null

Joda-Zaman genellikle, varsayılan ayar, geçerli zaman damgası vb dilimimi sistemi için varsayılan olarak NULL kullanın. genel amaçlı-310 neredeyse her zaman NULL değerleri reddeder.

Hassas

Genel amaçlı-310 Joda-Zaman millisecond hassas sınırlı iken nanonsecond hassas işler.

Desteklenen alanlar:

Genel bakış desteklenen alanlar Java-8 (genel amaçlı-310) tarafından verilen bazı sınıflarda temporal paketi (örneğin ChronoField WeekFields) ise Joda-Zaman oldukça zayıf, bu alan - DateTimeFieldType. Joda-Zaman en büyük eksikliği burada hafta ile ilgili lokalize alanların olmamasıdır. Hem saha uygulaması, tasarım ortak bir özelliği, her iki tip uzun (başka türleri, çeteleler bile) değerlere dayalı olmasıdır.

Numaralama

Genel amaçlı-310 Joda-Zaman ağırlıklı Java 5 daha önce 2002-2004 yıl içinde geliştirilmiştir, çünkü bu teklif etmese DayOfWeek Month enums bulunmaktadır.

Bölge API

a) genel amaçlı-310 Joda-Zaman dilimi daha fazla özellik sunuyor. İkincisi genel amaçlı-310 bunu yapmak için yeteneğine sahip iken saat dilimi uzaklığı geçişler tarihine programmatical bir erişim verim mümkün değil.

b) bilgi İçin: genel amaçlı-310 yeni bir yer ve farklı bir biçime iç dilimimi depo taşındı. Eski kütüphane klasör lib/zi artık yok.

Özellik vs ayarlayıcı

Genel amaçlı-310 var tanıttı TemporalAdjuster-arayüz olarak resmi bir şekilde yansıtmak temporal hesaplamalar ve manipülasyonlar, özellikle kütüphane veya çerçeve yazarlar bu güzel ve nispeten kolay bir şekilde gömmek için yeni uzantıları genel amaçlı-310 (eşdeğer statik yardımcı sınıflar için eski java.util.Date).

Çoğu kullanıcı için, ancak, bu özellik kod yazma yükünü hala kullanıcı olduğu için çok sınırlı bir değeri vardır. Built-tabanlı çözümler konusunda yeni TemporalAdjusterkavram değil bir sürü var şu anda sadece yardımcı sınıfı TemporalAdjusters ile sınırlı bir dizi değişiklikleri (ve çeteleler Month geçici ya da diğer türleri).

Joda-Zaman yeni alan uygulamaları kodu çok zor olduğunu kanıtlar göstermiştir alanı-paketi ama bir uygulama sunuyor. Diğer taraf-Zaman Joda fazla sözde bazı manipülasyonlar çok daha kolay ve genel amaçlı-310, örneğin property.withMaximumValue() daha zarif hale getiren özellikler.

Takvim sistemleri

Genel amaçlı-310 4 ekstra takvim sistemleri sunmaktadır. En ilginç olanı Umalqura (Suudi Arabistan kullanılır). Diğer 3: Minguo (Tayvan), Japonca (1871! beri sadece modern takvim) 46 ** (sonra 1940 yalnızca doğru).

Joda-Zaman Islamic calendar calculatory dayalı bir taban Umalqura gibi nişan tabanlı bir takvim sunuyor. Tay-Budist de benzer bir formda Joda-Zaman, Minguo ve Japon bir teklif yok. Aksi takdirde Joda-Zaman Kıpti ve ethiopic takvim de ki kalite ve doğruluğu hakkında bir şey söyleyemem sunar.

Daha çok Avrupalılar için ilginç: Joda-Zaman da Gregorian, Julian ve karma Gregoryen-Jülyen takvimi sunuyor. Ancak, gerçek tarihi hesaplamaları için pratik değeri farklı yıl gibi önemli özellikleri tarih içinde başlar, çünkü sınırlıdır geçmişi hiç desteklenmez (aynı eleştiri eski java.util.GregorianCalendar için geçerlidir).

Hebrew Persian Hindu gibi diğer takvimler tamamen de kütüphaneleri eksik.

Epoch gün

Genel amaçlı-310 Joda-Zaman (sürüm 2.0) sınıfı DateTimeUtils bazı yardımcı yöntemler sunarken 53* *sınıf vardır.

Saatler

Genel amaçlı-310 herhangi bir saat bağımlılık enjeksiyon için kullanılan arabirim (tasarım hata) ama soyut bir sınıf java.time.Clock vardır. Joda-Zaman yerine arayüzü MillisProvider DateTimeUtils bazı yardımcı yöntemler sunar. Bu şekilde Joda-Zaman da farklı saatler ile test odaklı modelleri (alay vb.) destekleme yeteneğine sahiptir.

Süresi aritmetik

Her iki kitaplıkları bir veya daha fazla geçici birim zaman mesafeleri hesaplama desteği. Tek ünite-süreleri-310 tarzı genel amaçlı kullanım belli ki güzel ancak, (ve uzun tabanlı kullanmak yerine int):

Genel amaçlı-310 => long days = ChronoUnit.DAYS.between(date1, date2);

Joda-Zaman => int days = DAYS.daysBetween(date1, date2).getDays();

Çoklu-birim-kullanım süreleri de farklıdır. Hatta hesaplama sonuçları farklı - bu Joda-Time issue kapalı görebilirsiniz. Süre genel amaçlı-310 kullanmak çok basit ve sınırlı bir yaklaşım kullanın sadece sınıfları Period (süresine göre yıl, ay ve gün) ve Duration (dayalı saniye ve nanosaniye), Joda-Zaman kullanan bir Daha sofistike bir şekilde kullanarak sınıfı PeriodType sipariş kontrol eden birimleri bir süre (Joda-Zaman "Dönem") bendi dile getirdi. PeriodType-API garip bir şekilde kullanmak için ise benzer bir şekilde genel amaçlı-310 tarafından sunulan değildir. Özellikle henüz-310 genel amaçlı karma tarihi ve saati süreler (örneğin, gün ve saat bazında) belirlemek mümkün değildir. Başka bir kütüphaneden göç konusunda ise uyardı. Tartışma kitaplıkları uyumsuz - kısmen aynı sınıf adları rağmen.

Aralıklarla

Genel amaçlı-310 Joda-Zaman sınırlı bir destek var ise bu özelliği desteklemiyor. SO-answer bu da bakın.

Biçimlendirme ve Ayrıştırma

En iyi iki kitaplıkları karşılaştırmak için yoludur eşit adında sınıfları DateTimeFormatterBuilder (genel amaçlı-310) ve DateTimeFormatterBuilder (Joda-Zaman) görüntülemek için. -310-genel amaçlı değişken biraz daha güçlü (TemporalField her türlü işleyebilir alan uygulayıcı resolve() gibi bazı uzantısı puan kod başardı sağlanır). En önemli fark ise bana göre: genel amaçlı-310 çok daha iyi olabilir ayrıştırmak zaman dilimi isimleri (biçim desen sembol z) ise Joda-Zaman değil, bu hiç de onun önceki sürümleri ve şimdi sadece çok kısıtlı bir şekilde.

Aksi takdirde Joda-Zaman biçimi PeriodFormatter kullanma süreleri unutulmamalıdır. Genel amaçlı-310 bunu yapamaz.


Bu bakış yardımcı olur umarım. Tüm toplanan bilgi ve daha iyi bir tarih ve zamanı kitaplığı (hiçbir şey mükemmel değildir) tasarım nasıl esas orada benim çabaları ve araştırmaları nedeniyle.

2015-06-24: güncelleme

Bu arada zaman yazmak ve Java farklı zaman kütüphaneleri için publish a tabular overview buldum. Tablolar da Joda-Zaman arasında bir karşılaştırma v2 içerir.8.Ve Java-8 (genel amaçlı-310) 1. Bu yazı daha detaylı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dion Coulls

    Dion Coulls

    16 AĞUSTOS 2006
  • MuscleProdigyTV

    MuscleProdig

    8 Ocak 2011
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005