java - जावा तिथि बनाम कैलेंडर




date calendar (11)

क्या कोई व्यक्ति Date और Calendar प्रकारों के आसपास वर्तमान "सर्वोत्तम अभ्यास" की सलाह दे सकता है।

नए कोड लिखते समय, क्या हमेशा Calendar से अधिक Date पक्ष लेना सबसे अच्छा होता है, या ऐसी परिस्थितियां होती हैं जहां Date अधिक उचित डेटाटाइप होती है?


Answers

Date को समय पर अपरिवर्तनीय बिंदु के रूप में उपयोग किया जाना चाहिए; Calendar म्यूटेबल हैं, और अंतिम तिथि के साथ आने के लिए आपको अन्य कक्षाओं के साथ सहयोग करने की आवश्यकता होने पर चारों ओर पारित किया जा सकता है। उन्हें String और String समान StringBuilder और आप समझेंगे कि मुझे कैसे लगता है कि उनका उपयोग किया जाना चाहिए।

(और हाँ, मुझे पता है कि तारीख वास्तव में तकनीकी रूप से अपरिवर्तनीय नहीं है, लेकिन इरादा यह है कि इसे उत्परिवर्तनीय नहीं होना चाहिए, और यदि कुछ भी बहिष्कृत तरीकों को कॉल नहीं करता है तो ऐसा होता है।)


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

हमारी प्राकृतिक वार्तालाप में, अगर 1 नवंबर, 2013 को 1 बजे एनवाई टाइम में नियुक्ति की स्थापना की जाती है, तो यह डेटटाइम है। यह कैलेंडर नहीं है। तो हम जावा में इस तरह से बातचीत करने में सक्षम होना चाहिए।

जब दिनांक एक लंबे पूर्णांक के रूप में संग्रहीत किया जाता है (1 जनवरी 1 9 70 या कुछ के बाद मिली सेकंड का), इसकी वर्तमान तिथि की गणना कैलेंडर पर निर्भर करती है। अलग-अलग कैलेंडर अलग-अलग तारीख देंगे। यह एक पूर्ण समय देने की संभावना से है (उदाहरण के लिए बिग बैंग के बाद 1 ट्रिलियन सेकंड)। लेकिन अक्सर हमें वार्तालाप के सुविधाजनक तरीके की भी आवश्यकता होती है, जैसे ऑब्जेक्ट एन्सेप्लेटिंग वर्ष, महीने इत्यादि।

मुझे आश्चर्य है कि जावा में इन 2 उद्देश्यों को सुलझाने के लिए नई प्रगति है या नहीं। शायद मेरा जावा ज्ञान बहुत पुराना है।


यदि संभव हो तो मैं आम तौर पर तारीख का उपयोग करता हूं। हालांकि यह उत्परिवर्तनीय है, म्यूटेटर वास्तव में बहिष्कृत हैं। अंत में यह मूल रूप से एक लंबे समय तक लपेटता है जो दिनांक / समय का प्रतिनिधित्व करेगा। इसके विपरीत, अगर मैं मूल्यों में हेरफेर करना चाहता हूं तो मैं कैलेंडर का उपयोग करूंगा।

आप इस बारे में सोच सकते हैं: आप केवल स्ट्रिंगबफर का उपयोग करते हैं जब आपको स्ट्रिंग्स की आवश्यकता होती है जिसे आप आसानी से जोड़ सकते हैं और फिर उन्हें स्ट्रिंग () विधि का उपयोग करके स्ट्रिंग्स में परिवर्तित कर सकते हैं। इसी तरह, अगर मैं अस्थायी डेटा में हेरफेर करने की ज़रूरत है तो मैं केवल कैलेंडर का उपयोग करता हूं।

सर्वोत्तम अभ्यास के लिए, मैं डोमेन मॉडल के बाहर जितना संभव हो सके अपरिवर्तनीय वस्तुओं का उपयोग करता हूं। यह किसी भी साइड इफेक्ट्स की संभावनाओं को काफी कम करता है और यह आपके लिए जुनीट टेस्ट के बजाय कंपाइलर द्वारा किया जाता है। आप अपनी कक्षा में निजी अंतिम फ़ील्ड बनाकर इस तकनीक का उपयोग करते हैं।

और स्ट्रिंगबफर समरूपता पर वापस आ रहा है। यहां कुछ कोड दिया गया है जो आपको दिखाता है कि कैलेंडर और दिनांक के बीच कैसे परिवर्तित करें

String s = "someString"; // immutable string
StringBuffer buf = new StringBuffer(s); // mutable "string" via StringBuffer
buf.append("x");
assertEquals("someStringx", buf.toString()); // convert to immutable String

// immutable date with hard coded format.  If you are hard
// coding the format, best practice is to hard code the locale
// of the format string, otherwise people in some parts of Europe
// are going to be mad at you.
Date date =     new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2001-01-02");

// Convert Date to a Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);

// mutate the value
cal.add(Calendar.YEAR, 1);

// convert back to Date
Date newDate = cal.getTime();

// 
assertEquals(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2002-01-02"), newDate);

पार्टी में थोड़ी देर हो चुकी है, लेकिन जावा के पास जेडीके 8 में एक नया डेट टाइम एपीआई है। आप अपने जेडीके संस्करण को अपग्रेड करना और मानक को गले लगा सकते हैं। कोई और गन्दा तारीख / कैलेंडर नहीं, कोई और तृतीय पक्ष जार नहीं।


डेट ऑब्जेक्ट को संग्रहीत करने के लिए तिथि सबसे अच्छी है। यह लगातार एक है, serialized एक ...

कैलेंडर दिनांक में हेरफेर करने के लिए सबसे अच्छा है।

नोट: हम कभी-कभी java.lang का समर्थन करते हैं। तिथि से अधिक, क्योंकि तिथि उत्परिवर्तनीय है और इसलिए थ्रेड-सुरक्षित नहीं है। किसी दिनांक ऑब्जेक्ट पर, दोनों के बीच स्विच करने के लिए setTime () और getTime () का उपयोग करें। उदाहरण के लिए, एप्लिकेशन में एक निरंतर तिथि (उदाहरण: शून्य 1970/01/01, या एक आवेदक END_OF_TIME जो आप 2099/12/31 पर सेट करते हैं; वे प्रारंभिक समय और समाप्ति समय के रूप में शून्य मानों को प्रतिस्थापित करने के लिए बहुत उपयोगी हैं, खासकर जब आप उन्हें डेटाबेस में बनाते हैं, क्योंकि एसक्यूएल नल के साथ इतना अनोखा है)।


जावा 8 के साथ, नया जावा.टाइम पैकेज इस्तेमाल किया जाना चाहिए।

ऑब्जेक्ट्स अपरिवर्तनीय हैं, समय क्षेत्र और दिन की हल्की बचत को ध्यान में रखा जाता है।

आप पुराने java.util.Date ऑब्जेक्ट से ZonedDateTime ऑब्जेक्ट बना सकते हैं:

    Date date = new Date();
    ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());

बीटीडब्ल्यू "डेट" को आम तौर पर "अप्रचलित / बहिष्कृत" के रूप में टैग किया जाता है (मुझे बिल्कुल पता नहीं क्यों है) - इसके बारे में कुछ लिखा गया है जावा: दिनांक निर्माता का बहिष्कार क्यों किया गया है, और इसके बजाय मैं इसका उपयोग कैसे करूं?

ऐसा लगता है कि यह नई तारीख (int वर्ष, int month, int day) के माध्यम से केवल कन्स्ट्रक्टर की समस्या है, अनुशंसित तरीका कैलेंडर के माध्यम से है और अलग-अलग पैरा सेट करता है .. ( कैलेंडर cal = calendar.getInstance (); )


  • Date और Calendar वास्तव में एक ही मौलिक अवधारणा है (दोनों समय में तत्काल प्रतिनिधित्व करते हैं और एक अंतर्निहित long मूल्य के आसपास रैपर होते हैं)।

  • कोई तर्क दे सकता है कि Calendar वास्तव में Date से भी अधिक टूटा हुआ है, क्योंकि ऐसा लगता है कि सप्ताह के दिन और दिन के समय जैसी चीजों के बारे में ठोस तथ्य प्रदान करते हैं, जबकि यदि आप अपना समय timeZone हैं, तो कंक्रीट timeZone में बदल जाता है! इस कारण से न तो वस्तुएं साल-दर-दिन या दिन-प्रतिदिन की दुकान के रूप में वास्तव में उपयोगी होती हैं।

  • केवल कैलकुलेटर के रूप में Calendar उपयोग करें, जब Date और TimeZone ऑब्जेक्ट दिए जाते हैं, तो आपके लिए गणना करेंगे। किसी एप्लिकेशन में संपत्ति टाइपिंग के लिए इसके उपयोग से बचें।

  • SimpleDateFormat और डिस्प्ले स्ट्रिंग्स उत्पन्न करने के लिए Date साथ SimpleDateFormat उपयोग करें।

  • यदि आप जोडा-टाइम का साहसी उपयोग महसूस कर रहे हैं, हालांकि यह अनावश्यक रूप से जटिल आईएमएचओ है और जल्द ही किसी भी घटना में जेएसआर -310 दिनांक एपीआई द्वारा इसे सुपरसीड किया जा सकता है।

  • मैंने पहले जवाब दिया है कि अपनी खुद की YearMonthDay कक्षा को रोल करना मुश्किल नहीं है, जो दिनांक गणना के लिए हुड के तहत Calendar का उपयोग करता है। मुझे सुझाव के लिए डाउनवॉट किया गया था लेकिन मुझे अभी भी विश्वास है कि यह वैध है क्योंकि ज्यादातर उपयोग-मामलों के लिए Joda-Time (और JSR-310 ) वास्तव में बहुत जटिल हैं।


तिथि एक सरल वर्ग है और मुख्य रूप से पिछड़े संगतता कारणों के लिए है। यदि आपको विशेष तिथियां सेट करने या अंकगणित करने की आवश्यकता है, तो कैलेंडर का उपयोग करें। कैलेंडर स्थानीयकरण को भी संभालते हैं। तिथि की पिछली तारीख मैनिपुलेशन फ़ंक्शंस को तब से बहिष्कृत कर दिया गया है।

निजी तौर पर जब मैं कोई विकल्प होता हूं तो मुझे मिलीसेकंड में लंबे समय तक (या लंबे, उचित के रूप में) या कैलेंडर का उपयोग करना पड़ता है।

दिनांक और कैलेंडर दोनों उत्परिवर्तनीय हैं, जो किसी एपीआई में उपयोग करते समय समस्याएं प्रस्तुत करते हैं।


नए कोड के लिए सबसे अच्छा तरीका (यदि आपकी पॉलिसी थर्ड-पार्टी कोड की अनुमति देती है) joda-time.sourceforge.net का उपयोग करना है।

Date , Calendar और दोनों में, इतनी सारी डिज़ाइन समस्याएं हैं कि न तो नए कोड के लिए अच्छे समाधान हैं।


मैंने hereकिसी भी प्रोग्रामिंग भाषाओं के लिए इस तरह के प्रश्नों के लिए समर्पित धागा बनाया here

जावा का भी उल्लेख है । संक्षिप्त सारांश यहां दिया गया है:

  • जावा मूल्य के आधार पर पैरामीटर पास करता है
  • "मूल्य से" जावा में एक विधि को पैरामीटर पास करने का एकमात्र तरीका है
  • पैरामीटर के रूप में दिए गए ऑब्जेक्ट से विधियों का उपयोग करने से ऑब्जेक्ट को संदर्भित किया जाएगा क्योंकि संदर्भ मूल ऑब्जेक्ट्स को इंगित करते हैं। (यदि वह विधि स्वयं कुछ मान बदलती है)




java date calendar