जावा 8 डेट टाइम एपीआई (java.time) और जोडा-टाइम के बीच अंतर


264

मुझे पता है कि java.util.Date और Joda-Time से संबंधित प्रश्न हैं । लेकिन कुछ खुदाई के बाद, मुझे java.time एपीआई ( जावा 8 में नया , जेएसआर 310 द्वारा परिभाषित ) और जोडा-टाइम के बीच के अंतर के बारे में एक धागा नहीं मिला ।

मैंने सुना है कि जावा 8 का java.time एपीआई बहुत क्लीनर है और जोडा-टाइम की तुलना में बहुत अधिक कर सकता है। लेकिन मुझे दोनों की तुलना करने वाले उदाहरण नहीं मिल रहे हैं।

  • जावा क्या कर सकता है?
  • Joda.time, Joda-Time से बेहतर क्या कर सकती है?
  • क्या java.time के साथ प्रदर्शन बेहतर है?

8
ऐसा नहीं है, यह जावा 7 से संबंधित है, जावा 8 से नहीं। उस प्रश्न का उत्तर बहुत कम विवरण के साथ जावा 8 के लिए संपादित किया गया था। मेरा प्रश्न विशेष रूप से जावा 8 के नए डेटाइम एपीआई के बारे में पूछ रहा है, जावा 7 के java.util.Date के बारे में नहीं। मैं सिर्फ एक उत्तर की तलाश कर रहा हूं जो जावा 8 की तुलना JodaTime से करता है।
ज़ैक

2
शायद यह Oracle दस्तावेज़ आपकी मदद कर सकता है।
मारियोड्स

यदि आपके पास जावा 7 है, तो अतिरिक्त पुस्तकालय का उपयोग करें, यदि आपके पास जावा 8 है, तो अंतर्निहित पुस्तकालय का उपयोग करें। चूंकि दोनों पुस्तकालय मूल रूप से एक ही व्यक्ति द्वारा डिज़ाइन किए गए हैं, इसलिए मुझे यकीन नहीं है कि आप कौन से प्रमुख अंतर की उम्मीद कर रहे हैं।
पीटर लॉरी

2
@PeterLawrey: Joda-Time और Java 8 तारीख और समय एपीआई वास्तव में काफी अलग हैं।
jarnbjo

5
आप इस ब्लॉग पोस्ट को स्टीफन कॉलबोर्न - दोनों परियोजनाओं के प्राथमिक लेखक से भी पढ़ सकते हैं ।
मैट जॉनसन-पिंट

जवाबों:


416

आम सुविधाएं

a) दोनों पुस्तकालय अपरिवर्तनीय प्रकारों का उपयोग करते हैं। जोडा-टाइम अतिरिक्त म्यूटेबल प्रकार भी प्रदान करता है MutableDateTime

बी) इसके अलावा: दोनों पुस्तकालय एरिक इवांस के डिजाइन अध्ययन "टाइमएंडमनी" से प्रेरित हैं या मार्टिन फावलर से डोमेन संचालित शैली के बारे में विचार करते हैं ताकि वे एक धाराप्रवाह प्रोग्रामिंग शैली के लिए कम या ज्यादा प्रयास करें (हालांकि हमेशा सही नहीं; ;-))।

ग) दोनों पुस्तकालयों के साथ हमें एक वास्तविक कैलेंडर तिथि प्रकार (कहा जाता है LocalDate), एक वास्तविक दीवार समय प्रकार (कहा जाता है LocalTime) और रचना (कहा जाता है LocalDateTime)। पुराने java.util.Calendarऔर की तुलना में यह बहुत बड़ी जीत है java.util.Date

डी) दोनों पुस्तकालय एक विधि-केंद्रित दृष्टिकोण का उपयोग करते हैं जिसका अर्थ है कि वे उपयोगकर्ता को getDayOfYear()इसके बजाय उपयोग करने के लिए प्रोत्साहित करते हैं get(DAY_OF_YEAR)। इसकी तुलना में बहुत अधिक अतिरिक्त विधियां होती हैं java.util.Calendar(हालांकि बाद में टाइप के अत्यधिक उपयोग के कारण यह बिल्कुल सुरक्षित नहीं है)।

प्रदर्शन

अन्य जवाब देखें @ OO7 द्वारा मिखाइल वोर्त्सोव के विश्लेषण की ओर इशारा करते हुए हालांकि बिंदु 3 (अपवाद को पकड़ने) शायद अप्रचलित है - इस JDK- बग को देखें । विभिन्न प्रदर्शन (जो जेएसआर -310 के सामान्य पक्ष में है ) मुख्य रूप से इस तथ्य के कारण है कि जोडा-टाइम का आंतरिक कार्यान्वयन हमेशा मशीन-टाइम की तरह लंबे-आदिम (मिलीसेकंड में) का उपयोग करता है।

शून्य

Joda-Time अक्सर NULL का उपयोग सिस्टम टाइमज़ोन के लिए डिफ़ॉल्ट, डिफ़ॉल्ट लोकेल, वर्तमान टाइमस्टैम्प आदि के रूप में करता है जबकि JSR-310 लगभग हमेशा NULL मानों को अस्वीकार करता है।

शुद्धता

JSR-310 नैनो- सेकंड की सटीकता को संभालती है, जबकि Joda-Time को मिलीसेकंड परिशुद्धता तक सीमित किया जाता है ।

समर्थित फ़ील्ड:

Java-8 (JSR-310) में समर्थित फ़ील्ड के बारे में एक अवलोकन कुछ वर्गों द्वारा टेम्पोरल-पैकेज (उदाहरण के लिए ChronoField और WeekFields ) में दिया गया है, जबकि Joda-Time इस क्षेत्र में कमज़ोर है - DateTimeFieldType देखें । जोडा-टाइम की सबसे बड़ी कमी यहां स्थानीयकृत सप्ताह से संबंधित क्षेत्रों की अनुपस्थिति है। दोनों क्षेत्र कार्यान्वयन डिजाइन की एक सामान्य विशेषता यह है कि दोनों प्रकार के मानों पर आधारित हैं (कोई अन्य प्रकार नहीं, यहां तक ​​कि एनम भी नहीं)।

enum

JSR-310 प्रस्तावों enums चाहते DayOfWeekया Monthजबकि Joda समय इसकी पेशकश नहीं करता है क्योंकि यह मुख्य रूप से पहले के वर्षों 2002-2004 में विकसित किया गया था जावा 5

जोन एपीआई

a) JSR-310, Joda-Time की तुलना में अधिक टाइमज़ोन सुविधाएँ प्रदान करता है। लैटर टाइमजोन ऑफसेट संक्रमण के इतिहास के लिए एक प्रोग्रामेटिक पहुंच प्राप्त करने में सक्षम नहीं है, जबकि JSR-310 ऐसा करने में सक्षम है।

बी) आपकी जानकारी के लिए: JSR-310 ने अपनी आंतरिक टाइमज़ोन रिपॉजिटरी को एक नए स्थान और एक अलग प्रारूप में स्थानांतरित कर दिया है। पुराने लाइब्रेरी फ़ोल्डर lib / zi का कोई अस्तित्व नहीं है।

समायोजक बनाम संपत्ति

JSR-310 ने TemporalAdjusterअस्थायी गणना और जोड़तोड़ को औपचारिक रूप से लागू करने के लिए एक औपचारिक तरीके के रूप में -इंटरफेस पेश किया है , विशेष रूप से लाइब्रेरी या फ्रेमवर्क-लेखकों के लिए यह JSR-310 के नए एक्सटेंशन को स्थिर करने के लिए एक अच्छा और सापेक्ष आसान तरीका है (स्थैतिक सहायक के बराबर) पूर्व के लिए कक्षाएं java.util.Date)।

हालांकि अधिकांश उपयोगकर्ताओं के लिए, इस सुविधा का बहुत सीमित मूल्य है क्योंकि कोड लिखने का बोझ अभी भी उपयोगकर्ता के पास है। नई- TemporalAdjusterअवधारणा के आधार पर निर्मित समाधान इतने सारे नहीं हैं, वर्तमान में केवल TemporalAdjustersहेरफेर का एक सीमित सेट (और एनम Monthया अन्य अस्थायी प्रकार) के साथ सहायक वर्ग है ।

जोडा-टाइम एक फील्ड-पैकेज प्रदान करता है, लेकिन अभ्यास ने सबूत दिखाया है कि नए क्षेत्र कार्यान्वयन कोड के लिए बहुत कठिन हैं। दूसरी तरफ Joda-Time तथाकथित गुण प्रदान करता है जो JSR-310 की तुलना में कुछ जोड़तोड़ को बहुत आसान और अधिक सुरुचिपूर्ण बनाते हैं, उदाहरण के लिए property.withMaximumValue ()

कैलेंडर सिस्टम

JSR-310 4 अतिरिक्त कैलेंडर सिस्टम प्रदान करता है। सबसे दिलचस्प एक उमलकुरा (सऊदी अरब में इस्तेमाल किया गया) है। अन्य 3 हैं: Minguo (ताइवान), जापानी (1871 के बाद से केवल आधुनिक कैलेंडर!) और थाईबुद्धवादी (केवल 1940 के बाद सही)।

Joda-Time एक इस्लामिक कैलेंडर प्रदान करता है जो गणना के आधार पर आधारित है - न कि उमालकुरा ​​जैसा कोई दिखने वाला कैलेंडर। थाई-बौद्ध भी एक समान रूप में जोडा-टाइम द्वारा प्रस्तुत किया जाता है, मिगुओ और जापानी एक नहीं। अन्यथा जोडा-टाइम कोप्टिक और इथियोपिक कैलेंडर प्रदान करता है, वह भी (लेकिन अंतर्राष्ट्रीयकरण के समर्थन के बिना)।

यूरोपीय लोगों के लिए अधिक दिलचस्प: जोडा-टाइम ग्रेगोरियन , जूलियन और मिश्रित-ग्रेगोरियन-जूलियन कैलेंडर भी प्रदान करता है । हालांकि, वास्तविक ऐतिहासिक गणना के लिए व्यावहारिक मूल्य सीमित है क्योंकि विभिन्न वर्ष जैसे महत्वपूर्ण तारीख इतिहास में शुरू होते हैं, बिल्कुल भी समर्थन नहीं किया जाता है (वही आलोचना पुराने के लिए मान्य है java.util.GregorianCalendar)।

अन्य कैलेंडर जैसे हिब्रू या फ़ारसी या हिंदू दोनों पुस्तकालयों में पूरी तरह से गायब हैं।

युग दिन

JSR-310 वर्ग है JulianFields जबकि Joda समय (संस्करण 2.0) वर्ग में कुछ सहायक तरीके प्रदान करता है DateTimeUtils

घड़ियों

JSR-310 का कोई इंटरफ़ेस (एक डिज़ाइन गलती) नहीं है, लेकिन एक सार वर्ग java.time.Clockजो किसी भी घड़ी निर्भरता इंजेक्शन के लिए इस्तेमाल किया जा सकता है। Joda-Time इंटरफ़ेस MillisProvider और इसके बजाय DateTimeUtils में कुछ सहायक तरीके प्रदान करता है । तो इस तरह जोडा-टाइम विभिन्न घड़ियों (मॉकिंग आदि) के साथ परीक्षण-संचालित मॉडल का समर्थन करने में भी सक्षम है।

अवधि अंकगणित

दोनों पुस्तकालय एक या अधिक लौकिक इकाइयों में समय दूरी की गणना का समर्थन करते हैं। हालांकि, जब सिंगल-यूनिट-ड्यूरेशन को हैंडल करते हैं JSR-310-style स्पष्ट रूप से अच्छे हैं (और इंट का उपयोग करने के बजाय लंबे समय से आधारित):

JSR-310 => long days = ChronoUnit.DAYS.between(date1, date2);

जोडा-समय => int days = DAYS.daysBetween(date1, date2).getDays();

मल्टीपल यूनिट-ड्यूरेशन के हैंडलिंग भी अलग-अलग हैं। यहां तक ​​कि गणना के परिणाम अलग-अलग हो सकते हैं - यह बंद Joda-Time समस्या देखें । जबकि JSR-310 एक बहुत ही सरल और सीमित दृष्टिकोण का उपयोग करता है बस वर्गों Period(वर्षों, महीनों और दिनों के आधार पर अवधि) और Duration(सेकंड और नैनोसेकंड के आधार पर) का उपयोग करने के लिए, जोडा-टाइम वर्ग का उपयोग करने के लिए और अधिक परिष्कृत तरीके का उपयोग करता PeriodTypeहै ताकि नियंत्रण हो सके किन इकाइयों में एक अवधि (Joda-Time इसे "Period" कहते हैं) व्यक्त की जाएगी। जबकिPeriodType-एपीआई किसी तरह से उपयोग करने के लिए अजीब है जेएसआर -310 द्वारा बिल्कुल भी पेश नहीं किया गया है। विशेष रूप से JSR-310 मिश्रित तिथि और समय अवधि (उदाहरण के लिए दिन और घंटे के आधार पर) को परिभाषित करना संभव नहीं है। अगर एक पुस्तकालय से दूसरे पुस्तकालय में प्रवास की बात आती है तो चेतावनी दी जाए। आंशिक रूप से समान श्रेणी के नामों के बावजूद चर्चा में पुस्तकालय असंगत हैं।

अंतराल

जेएसआर -310 इस सुविधा का समर्थन नहीं करता है जबकि जोडा-टाइम के पास सीमित समर्थन है। यह भी देखें इस SO-जवाब

स्वरूपण और पार्सिंग

दोनों पुस्तकालयों की तुलना करने का सबसे अच्छा तरीका समान-नाम वाली कक्षाओं DateTimeFormatterBuilder (JSR-310) और DateTimeFormatterBuilder (Joda-Time) को देखना है । JSR-310-वैरिएंट थोड़ा अधिक शक्तिशाली है (किसी भी प्रकार के हैंडल को भी TemporalFieldप्रदान कर सकता है बशर्ते कि फ़ील्ड इंप्लॉयर कुछ एक्सटेंशन पॉइंट्स जैसे रिज़ॉल्यूशन () ) को कोड करने में कामयाब हो । हालांकि सबसे महत्वपूर्ण अंतर है - मेरी राय में:

JSR-310 ज्यादा बेहतर समयसीमा के नाम (प्रारूप पैटर्न प्रतीक z) को बेहतर बना सकता है जबकि Joda-Time अपने पहले के संस्करणों में और अब केवल बहुत सीमित तरीके से ऐसा नहीं कर सकता।

JSR-310 का एक और फायदा स्टैंडअलोन महीने के नामों के लिए समर्थन है जो रूसी या पोलिश आदि भाषाओं में महत्वपूर्ण है। जोडा-टाइम के पास ऐसे संसाधनों तक पहुंच नहीं है - जावा -8 प्लेटफार्मों पर भी नहीं।

JSR-310 की तुलना में पैटर्न सिंटैक्स भी Joda-Time की तुलना में अधिक लचीला है, वैकल्पिक वर्गों (वर्ग कोष्ठक का उपयोग करके) के लिए अनुमति देता है, CLDR-standard की ओर अधिक उन्मुख है और पेडिंग (अक्षर प्रतीक p) और अधिक फ़ील्ड प्रदान करता है।

अन्यथा यह ध्यान दिया जाना चाहिए कि Joda-Time, PeriodFormatter का उपयोग करके अवधि का प्रारूपण कर सकता है । JSR-310 ऐसा नहीं कर सकता।


आशा है कि यह अवलोकन मदद करेगा। सभी एकत्रित जानकारी मुख्य रूप से मेरे प्रयासों और जांच के कारण है कि एक बेहतर तारीख और समय पुस्तकालय को कैसे डिजाइन और कार्यान्वित किया जाए (कुछ भी सही नहीं है)।

2015-06-24 से अपडेट करें:

इस बीच मैंने जावा में विभिन्न समय पुस्तकालयों के लिए एक सारणीबद्ध अवलोकन लिखने और प्रकाशित करने का समय ढूंढ लिया है । टेबल में Joda-time v2.8.1 और Java-8 (JSR-310) के बीच तुलना भी है। यह इस पोस्ट की तुलना में अधिक विस्तृत है।


12
यह एक उत्कृष्ट पोस्ट है। इस जानकारी को साझा करने के लिए बहुत धन्यवाद। अगर जोडा और JSR-310 (केवल वेनिला उपयोग मामलों के लिए) के बीच विकल्प दिया जाता है, तो आप किसे चुनेंगे? मैं अभी इस विकल्प का सामना कर रहा हूं। मैं JSR-310 पर विचार कर रहा हूं, केवल इसलिए कि यह नया है और मैं जहां भी संभव हो "आगे बढ़ने" का समर्थन करने की कोशिश करता हूं।
केविनारपे

7
@kevinarpe अगर मेरे पास केवल JSR-310 और Joda-Time के बीच का चुनाव था, तो शायद मैं JSR-310 को पसंद करूंगा क्योंकि Joda-Time ने किसी और विकास को रोक दिया है (नई बड़ी विशेषताओं की उम्मीद नहीं की जा सकती है - बस बगफिक्सिंग और छोटे अपडेट)। और JSR-310 का डिज़ाइन अधिक आधुनिक है (और बेहतर आंतरिक गुणवत्ता के साथ)। हालांकि, आश्चर्य की बात नहीं है, लेकिन मेरा असली फैसला मेरी अपनी लाइब्रेरी Time4J को पसंद करने वाला है - मेरी पोस्ट के नीचे दिए गए सारणीबद्ध अवलोकन का लिंक भी देखें। विकल्प रखना हमेशा अच्छा होता है, और यह दृढ़ता से निर्भर करता है कि आपको किन विशेषताओं की आवश्यकता है।
मेनो होच्स्चिल्ड

एक अंतराल के Java8 के संस्करण की अवधि नहीं है?
क्रिश्चियन हुजेर

1
@ChristianHujer नहीं, java.time.Durationएक समय अंतराल पर लंगर डाले जाने वाले अंतराल के विपरीत, इसकी शुरुआत या समाप्ति के लिए नहीं सोचा जा सकता है। यह JSR-310-type एक अज्ञात शुरुआत के बाद से बीता हुआ सेकंड और नैनोसेकंड की एक जोड़ी है।
मेनो होच्स्चिल्ड

42

जावा 8 दिनांक / समय:

  1. जावा 8 कक्षाएं मानव समय के आसपास बनाई गई हैं। यह उन्हें मानव डेटाटाइम अंकगणित / रूपांतरण के लिए उपवास करता है।
  2. दिनांक / समय घटक गेटर्स जैसे getDayOfMonthजावा 8 कार्यान्वयन में ओ (1) जटिलता है।
  3. की पार्स OffsetDateTime/ OffsetTime/ ZonedDateTimeजावा 8 ईए b121 में बहुत धीमी गति से JDK में फेंक दिया और आंतरिक रूप से पकड़ा अपवाद के कारण है।
  4. संकुल का एक सेट: java.time.*, java.time.chrono.*, java.time.format.*, java.time.temporal.*,java.time.zone.*
  5. इंस्टेंट (टाइमस्टैम्प) दिनांक और समय आंशिक तिथि और समय पार्सर और प्रारूपक समय क्षेत्र विभिन्न कालक्रम (कैलेंडर)।
  6. मौजूदा वर्गों में तारीख जैसे मुद्दे हैं I18N या L10N के लिए कोई समर्थन नहीं है। वे परस्पर हैं!
  7. सरल और अधिक मजबूत।
  8. घड़ियों को इंजेक्ट किया जा सकता है।
  9. घड़ियों को विभिन्न गुणों के साथ बनाया जा सकता है - स्टेटिक क्लॉक, नकली घड़ियों, कम-सटीक घड़ियों (पूरे सेकंड, पूरे मिनट, आदि)।
  10. विशिष्ट समय क्षेत्रों के साथ घड़ियों का निर्माण किया जा सकता है। Clock.system(Zone.of("America/Los_Angeles"))
  11. कोड हैंडलिंग दिनांक और समय को परीक्षण योग्य बनाता है।
  12. समयक्षेत्र से स्वतंत्र परीक्षण करता है।

जोडा-समय:

  1. Joda-Time मशीन समय का उपयोग अंदर है। इंट / लंबे मानों के आधार पर एक मैनुअल कार्यान्वयन बहुत तेजी से होगा।
  2. जोडा-टाइम गेटर्स को हर गेट्टर कॉल पर कंप्यूटर-से-मानव समय गणना की आवश्यकता होती है, जो इस तरह के परिदृश्य में जोडा-टाइम को एक अड़चन बनाता है।
  3. यह अपरिवर्तनीय वर्गों से बना है जो इसे इंस्टैंट, दिनांक और समय, विभाजन और टिकाऊ संभालती है यह लचीला है यह अच्छी तरह से डिज़ाइन किया गया है।
  4. उदाहरण के रूप में तारीखों का प्रतिनिधित्व करता है। लेकिन एक तारीख और समय एक से अधिक पल के अनुरूप हो सकता है। दिन के उजाले समाप्त होने पर घंटे ओवरलैप करें। के रूप में अच्छी तरह से किसी भी पल नहीं है कि यह सब से मेल खाती है। दिन की रोशनी शुरू होने पर घंटा बजाएं। सरल ऑपरेशन के लिए जटिल संगणना करना है।
  5. इसके अधिकांश तरीकों पर मान्य मानों के रूप में नल को स्वीकार करता है। सूक्ष्म कीड़े की ओर जाता है।

अधिक विस्तृत तुलना के लिए देखें: -

Java 8 Date / Time लाइब्रेरी का प्रदर्शन (साथ ही Joda-Time 2.3 और juCalendar) । & जावा 8 में नई तिथि और समय एपीआई


जब आप कहते हैं कि "समय-क्षेत्र से स्वतंत्र परीक्षण करता है।" वास्तव में उससे आपका क्या मतलब है?
ज़ैक

@Zack: संभवत: यदि आप कोड का परीक्षण करते हैं, जो समय क्षेत्र के आधार पर अलग-अलग व्यवहार करता है, तो आपको परीक्षण को एक अलग डिफ़ॉल्ट टाइमज़ोन के साथ चलाने के लिए बाध्य करने की आवश्यकता हो सकती है जो ऑपरेटिंग सिस्टम द्वारा प्रदान की गई है।
जर्बंजो

हाह - मुझे लगा कि आपने कहा था कि joda आंतरिक रूप से मशीन टाइम के बजाय टाइम मशीन पर चलता था ... और मुझे आश्चर्य नहीं होगा
Kyranstar

4
@ OO7 'मानव समय' से आपका क्या तात्पर्य है? समय की गणना वैसे भी मशीनों द्वारा की जाती है।
इगोरगानापल्स्की

1

Joda-Time अब रखरखाव-मोड में है

सवाल का सीधा जवाब नहीं है लेकिन जोडा-टाइम परियोजना अब सक्रिय विकास में नहीं है। टीम का सुझाव है कि उपयोगकर्ता नए java.time API पर माइग्रेट करें । ओरेकल द्वारा ट्यूटोरियल देखें ।

आधिकारिक GitHub परियोजना पृष्ठ से:

समय-समय पर डेटा को अद्यतन रखने के अलावा, जोडा-टाइम अब सक्रिय विकास में नहीं है। जावा एसई 8 के बाद से, उपयोगकर्ताओं को java.time (JSR-310) पर माइग्रेट करने के लिए कहा जाता है - JDK का एक मुख्य हिस्सा जो इस परियोजना की जगह लेता है। Android उपयोगकर्ताओं के लिए, java.time को एपीआई 26+ में जोड़ा गया है। निम्न एपीआई स्तरों का समर्थन करने के लिए आवश्यक परियोजनाओं में थ्रीटेबैप लाइब्रेरी का उपयोग किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.