जावा टाइम बनाम जावा टाइम


19

हालाँकि, Joda फीचर समृद्ध है और मानक Java समय की तुलना में अधिक परिष्कृत है, यह हमेशा उपयोग करने के लिए सबसे अच्छी बात नहीं हो सकती है। मैं कैसे तय करूं कि मुझे किसी जावा कोड में जोडा टाइम या जावा टाइम का उपयोग करना चाहिए?

क्या किसी तरह की गाइडलाइन है जो हमें बताती है कि हमारी आवश्यकताओं के आधार पर सही को कैसे चुना जाए?


5
जावा 8 में शामिल नई तिथि और समय एपीआई का उपयोग करके, दोनों दुनिया का सर्वश्रेष्ठ प्राप्त करें । यह जोडा टाइम से काफी प्रभावित है। वास्तव में मुख्य लेखक स्टीफन कोलबोर्न, जोडा टाइम के लेखक हैं।
जोकिम सॉर

1
@JoachimSauer क्या यह अंतिम रिलीज़ में दिखाई दिया है या यह तब होगा जब जावा 8 लॉन्च होगा?
m3th0dman

@ m3th0dman: इसे अंतिम जावा 8 रिलीज में शामिल किया जाएगा, यह अभी तक जारी नहीं किया गया है। जीए वर्तमान में 2013-09-09 के लिए निर्धारित है
जोकिम सॉउर

जावा-टाइम और मूल जावा तिथि-समय दोनों वर्गों को जावा 8, जावा 9 और बाद में निर्मित java.time कक्षाओं से अलग कर दिया गया है।
बेसिल बॉर्क

जवाबों:


29

जावा टाइम लाइब्रेरी पर जोडा टाइम एक ऐसा सुधार है जो निम्न अपवादों के अलावा लगभग हमेशा सही विकल्प होता है:

  1. जब आपके प्रोजेक्ट में तीसरे पक्ष की निर्भरता जोड़ना मुश्किल या अवांछनीय है

  2. जब एक सार्वजनिक इंटरफ़ेस में इसका उपयोग मुद्दों का कारण होगा, उदाहरण के लिए जावा और जोडा दोनों समय क्षेत्रों को संभालने के लिए एक ओआरएम प्राप्त करना

हालांकि, 2 के मामले में) यदि संभव हो तो आंतरिक रूप से जोडा का उपयोग करना बेहतर होगा।

उपरोक्त बातें ध्यान में रखने योग्य हैं, लेकिन दुर्लभ होनी चाहिए। यदि संदेह है, तो Joda के साथ जाएं।


कृपया मुझे बताएं कि "जोडा आंतरिक रूप से उपयोग करें" का क्या मतलब है। मैं एक शुरुआत हूं और मुझे ये सारी बातें नहीं पता हैं।
जेडी नाइट

5
@ जेडी नाइट: इसका मतलब है कि एप्लिकेशन अपने तर्क के लिए जोडा का उपयोग करता है और केवल java.util से / में परिवर्तित होता है। जब यह बाहरी सिस्टम के साथ संचार करता है तो इसकी आवश्यकता होती है।
माइकल बोर्गवर्ड

2
'आंतरिक' द्वारा, यह संपूर्ण रूप में अनुप्रयोग के लिए आंतरिक हो सकता है (जैसा कि माइकल के उदाहरण में है), लेकिन यह किसी वर्ग या किसी विशेष विधि से आंतरिक हो सकता है। उदाहरण के लिए कहें कि आपके पास एक उपयोगिता विधि है जो दो जावा तिथि वस्तुओं को लेती है और उनके बीच कार्य दिवसों की संख्या की गणना करती है, लेकिन इसमें एक बग होता है। इसे ठीक करने के लिए, इसके बजाय JodaTime का उपयोग करके उस विधि को फिर से लिखना बहुत आसान हो सकता है, लेकिन आप विधि को कॉल करने वाले सभी कोड को रीफ़्रैक्टर करने का समय नहीं दे सकते हैं, इसलिए आप विधि हस्ताक्षर को अपरिवर्तित छोड़ देते हैं। इस स्थिति में आप उस पद्धति में "आंतरिक" जोडा का उपयोग कर रहे हैं।
रॉबर्ट जॉनसन

FYI करें, जोडा-टाइम परियोजना अब रखरखाव मोड में है , जिसमें टीम java.time कक्षाओं में प्रवास की सलाह दे रही है । ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

13

ध्यान दें कि Joda-Time वेबसाइट पर यह लिखा है:

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

Joda-Time के मुख्य योगदानकर्ता , jodastephen , JSR-310 के लिए भी मुख्य योगदानकर्ता हैं, जैसा कि http://www.threeten.org/ के साथ जुड़े GitHub रिपॉजिटरी पर देखा जा सकता है । वैसे, जोडस्टेपेन भी एक एसओ संभाल है ...

मुझे लगता है कि यह बताना सुरक्षित है कि हम नई तारीख और समय एपीआई के साथ आराम और सुरक्षित महसूस कर सकते हैं जैसा कि जावा 8 में दिया गया है।

कुछ अतिरिक्त संदर्भ:


12

जावा मानक तिथि एपीआई इतनी मूलभूत रूप से टूटी हुई है कि मैंने अक्सर JVM के पुस्तकालय एक्सटेंशन में बस जोडा टाइम को जोड़ने पर विचार किया है ताकि यह जावा एपीआई के बाकी हिस्सों के साथ डिफ़ॉल्ट रूप से क्लासपाथ पर लोड हो।

यदि आपको कभी भी अंतर्राष्ट्रीयकरण और समय क्षेत्रों को एक विरासत जावा एप्लिकेशन में शामिल करने का काम सौंपा गया है और अकेले मानक जावा एपीआई का उपयोग करने का प्रयास किया है, तो आप समझेंगे कि मेरा क्या मतलब है। मैं कोड की हज़ारों असाइन लाइनों को सौ से कम में बदलने में सक्षम था । उत्पादकता में वृद्धि अकल्पनीय है।

इसके अलावा मानक दिनांक एपीआई सहज नहीं है, जहां तरल पदार्थ Joda API को घंटों में उठाया जा सकता है, सप्ताह में नहीं। दो मील की दूरी पर स्थित द्वीप पर जाने की कोशिश करने की आपकी सादृश्यता निम्नलिखित के समान अधिक है।

1) एक मोटरबोट जो आपको केवल 6 मिनट में द्वीप पर पहुंचा देगी।

या ...

2) एक तूफान बांस की बेड़ा एक पागल आदमी जिसका सबसे अच्छा दोस्त एक वॉलीबॉल है द्वारा तूफान के दौरान दाखलताओं के साथ एक साथ बंधे।

जैसा कि अन्य जवाबों में कहा गया है, ORM जैसे कुछ कमियां भी अस्तित्वहीन हो रही हैं क्योंकि अब Hibernate में प्लगइन्स हैं जो डेटाबेस प्रकार / समय फ़ील्ड्स के लिए Joda प्रकार सेम संपत्तियों को मैप करने की अनुमति देते हैं। जेपीए के पास इसके लिए भी एक उत्तर हो सकता है।

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


FYI करें, जोडा-टाइम परियोजना अब रखरखाव मोड में है , जिसमें टीम java.time कक्षाओं में प्रवास की सलाह दे रही है । ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

8

एक और बिंदु: जावा-टाइम (यानी Date) थ्रेडसेफ़ नहीं है, लेकिन जोडाटाइम है। इसलिए आवश्यकता पड़ने पर JodaTime को प्राथमिकता दी जाती है

  • मल्टीट्रेडेड एनवायरनमेंट आम संसाधनों तक पहुंच बना रहा है
  • स्थितियों की तरह केंद्रीकृत समय सिंक्रनाइज़ेशन

या सरल अनुप्रयोगों के लिए जावा-टाइम ठीक है।


यहां तक ​​कि डेटटाइम भी थ्रेडसेफ़ नहीं है, है ना? अगर मैं गलत हो रहा हूं तो मुझे सुधारो।
विंटेश

3
डेटाइम क्लास सहित जोडा लाइब्रेरी का अधिकांश हिस्सा अपरिवर्तनीय है और इसलिए थ्रेड-सुरक्षित है। हालांकि कुछ उत्परिवर्तित वर्ग हैं जो थ्रेड-सुरक्षित नहीं हैं। Joda-time.sourceforge.net/faq.html#threading देखें ।
रॉबर्ट जॉनसन

1
के लिए थ्रेड सुरक्षा java.timeअपरिवर्तनीयता के माध्यम से कार्यान्वित की जाती है। Stackoverflow.com/questions/9303532/… देखें । यह सरल और जटिल दोनों अनुप्रयोगों के लिए अच्छी तरह से काम करता है। यहां तक ​​कि एपीआई डॉक्टर का कहना है कि "सभी वर्ग अपरिवर्तनीय और थ्रेड-सेफ हैं" (शाब्दिक रूप से दूसरे पैराग्राफ से उद्धृत)। java.utilदूसरी ओर पुरानी कक्षाओं में कई मुद्दे हैं। मुझे पता है कि यह उत्तर उत्तरार्द्ध को संदर्भित करता है, लेकिन अब उस अंतर को बनाने के लिए महत्वपूर्ण है।
योयो

अपरिवर्तनीय मूल्यों के रूप में तारीख का प्रतिनिधित्व नहीं करना सिर्फ पागल है। मुझे पता है कि यह अब तय हो गया है लेकिन वास्तव में दुनिया में वे क्या सोच रहे थे?
अलुआन हद्दाद

2

Java.time ढांचे की जगह दोनों विरासत तिथि-समय वर्गों और Joda समय

अद्यतन: जावा के शुरुआती संस्करणों के साथ भेज दी गई पुरानी तिथि-समय की कक्षाएं अब विरासत में हैं, आधिकारिक तौर पर जावा 8, जावा 9 और बाद में निर्मित जावा कक्षाओं द्वारा

Date, Calendar, SimpleDateFormat, और java.sql.*तारीख समय वर्गों सब बचा जाना चाहिए। इन भ्रामक, परेशान करने वाले, खराब डिज़ाइन वाले वर्गों का उपयोग करने की आवश्यकता नहीं है। उन्हें पूरी तरह से जावा.टाइम कक्षाओं द्वारा बदल दिया गया है। उनका एकमात्र उद्देश्य अब मौजूदा पुराने कोड को बनाए रखना है। पुराने कोड के साथ हस्तक्षेप करते समय, आप पुरानी कक्षाओं में जोड़े गए नए तरीकों को कॉल करके java.time से / में परिवर्तित कर सकते हैं। परिवर्तित करने के बारे में अधिक जानकारी के लिए, देखें: java.util में कनवर्ट करें। "java.time" प्रकार क्या है?

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं। जोडा-टाइम परियोजना ने java.time ढांचे को प्रेरित किया। दोनों एक ही आदमी, स्टीफन कोलबोर्न के नेतृत्व में हैं । आप java.time को सभी नए कोड, जोडा-टाइम के एक पुनर्लेखन / पुनर्निर्देशन के रूप में सोच सकते हैं, लेकिन इस उद्योग के पहले व्यापक और परिष्कृत तिथि-समय पुस्तकालय के निर्माण से जो कुछ वर्षों में सीखा गया था उसका उपयोग करना।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें।

Java.time कार्यक्षमता की ज्यादातर में जावा 6 और 7 के लिए वापस भेजा जाता है ThreeTen-backport और आगे के लिए अनुकूलित एंड्रॉयड में ThreeTenABP (देखें कैसे उपयोग करने के लिए ... )।

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित परिवर्धन के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक

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