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


364

किसी वर्तमान "सबसे अच्छा अभ्यास" के आसपास की सलाह कृपया सकते हैं Dateऔर Calendarप्रकार के।

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



2
FYI करें, जैसे परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत, द्वारा का स्थान ले लिया java.time कक्षाएं। जावा टाइमटाइम की अधिकांश कार्यक्षमता थ्रीटेन-बैकपोर्ट परियोजना में जावा 6 और जावा 7 में बैक-पोर्ट की गई है। इसके अलावा तीनटैनबप प्रोजेक्ट में पहले के एंड्रॉइड के लिए अनुकूलित । देखें कि थ्रीटेबैप का उपयोग कैसे करें…
बेसिल बॉर्क

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

जवाबों:


377

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

व्यक्तिगत रूप से मैं या तो एक विकल्प के रूप में एक लंबे (या लंबे, उपयुक्त के रूप में) या कैलेंडर के रूप में मिलीसेकंड में समय का उपयोग करता हूं।

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


5
FYI करें, इस तरह के रूप में बहुत परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

67

नए कोड के लिए सबसे अच्छा तरीका है (यदि आपकी नीति तृतीय-पक्ष कोड की अनुमति देती है) जोडा टाइम लाइब्रेरी का उपयोग करना है ।

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


7
मैंने joda time का उपयोग करने के लिए दूसरा सुझाव दिया। इसका उपयोग करना और समझना आसान है और अधिक कार्यक्षमता प्रदान करता है जिसका आप उपयोग कर सकते हैं।
जीरो वेन बर्गन

30
Joda Time का उपयोग करना है या मानक JDK वर्गों के साथ रहना है, इस पर चर्चा के लिए, stackoverflow.com/questions/589870/…
जोनीक

3
मैं नहीं जानता कि क्या यह नीचे उतरने लायक है, लेकिन यह सवाल का जवाब नहीं देता है। केवल एक टिप्पणी के रूप में बेहतर हो सकता है।
इडेडांटे

7
चूँकि यह सवाल थर्ड पार्टी लाइब्रेरी का उपयोग न करके डेट और कैलेंडर का उपयोग करने के बारे में था, जो किसी प्रोजेक्ट के लिए एकल विक्रेता निर्भरता जोखिम जोड़ता है।
आर्किमिडीज ट्रेजानो

3
यह "सबसे अच्छा तरीका है" जब तक java.time पैकेज जावा 8. साथ उपलब्ध कराया गया था
DaBlick

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

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

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

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

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

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


1
JSR310 के लिए एक समय सीमा है? यह जावा 7 में होने जा रहा था, लेकिन मेरा मानना ​​है कि अब ऐसा नहीं है।
ब्रायन एग्न्यू

@ ब्रायन - यह निश्चित रूप से उस मेलिंग सूची पर बहुत शांत हो गया है!
oxbow_lakes

बस जाँच, यह निष्क्रिय हो गया है, जिसका अर्थ है कि उन्होंने 18 महीनों में मील का पत्थर का मसौदा प्रकाशित नहीं किया है :-(
ब्रायन एग्न्यू

मेलिंग सूची पर सबसे हालिया टिप्पणी जुलाई से और स्टीफन द्वारा की गई है, इसलिए परियोजना शायद अभी भी दूर है
oxbow_lakes

माना। यदि आप जानते हैं कि डेट को एक अपरिवर्तनीय वस्तु के रूप में सुरक्षित रूप से कैसे उपयोग किया जाए, और डेट्स में हेरफेर करने के लिए कैलेंडर, अधिकांश लोगों को सुरक्षित होना चाहिए। Multithreaded कोड में SimpleDateFormat का उपयोग करते समय सावधान रहें।
cwash

25

किसी दिनांक ऑब्जेक्ट को संग्रहीत करने के लिए दिनांक सर्वश्रेष्ठ है। यह एक बनी हुई है, एक सीरियल है ...

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

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


मुझे लगता है कि आप इसे ले जा रहे हैं अपरिवर्तनीय के बारे मेंjava.lang.Long
pjp

17

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

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

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

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

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);

हां, अपरिवर्तनीय वस्तुएं तिथि-समय के काम के लिए समझ में आती हैं। Java.time कक्षाएं जो अपरिवर्तनीय वस्तुओं के पैटर्न का दमनDate / Calendarउपयोग करती हैं।
तुलसी बॉर्क

यह सच हो सकता है लेकिन 2010 में नहीं।
आर्किमिडीज ट्रेजानो

हाँ। लेकिन अब तक इस पृष्ठ को पढ़ने वाले हजारों लोग हैं , जो 150,000 से अधिक हैं। मेरी टिप्पणी उनके लिए एक टिप्पणी है, न कि आप की आलोचना।
तुलसी बॉर्क

मुझे पता है, इसीलिए मैंने दूसरे उत्तर को उकेरा। हालांकि, अभी भी कुछ लोग हैं जिन्हें पुराने JDK से पीड़ित होने की आवश्यकता है जो ऊपर दिए गए उत्तर की भी आवश्यकता है।
आर्किमिडीज ट्रेजानो

1
दरअसल, जावा 6 और 7 के लिए, हमारे पास थ्रीटेन-बैकपोर्ट प्रोजेक्ट है। यह वास्तव में एक ही एपीआई के साथ जावा की अधिकांश कार्यक्षमता लाता है। इसलिए उन भयानक विरासत तारीख-समय वर्गों का उपयोग करने की आवश्यकता नहीं है।
बेसिल बोर्क

15

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

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


हां, अपरिवर्तनीय वस्तुएं तिथि-समय के काम के लिए समझ में आती हैं। Java.time कक्षाएं जो अपरिवर्तनीय वस्तुओं के पैटर्न का दमनDate / Calendarउपयोग करती हैं। विशेष रूप से, Instantबदलता है java.util.Dateऔर ZonedDateTimeबदलता है Calendar/ GregorianCalendar
तुलसी बॉर्क

15

tl; डॉ

वर्तमान "सबसे अच्छा अभ्यास" के आसपास की सलाह DateऔरCalendar

यह सबसे अच्छा हमेशा के पक्ष में है CalendarअधिकDate

इन विरासत वर्गों से पूरी तरह से बचें । इसके बजाय java.time कक्षाओं का उपयोग करें ।

  • UTC में एक पल के लिए , का उपयोग करें (आधुनिक समकक्ष )Instant
    Date
  • किसी विशेष समय क्षेत्र में एक पल के लिए , (आधुनिक समतुल्य ) का उपयोग करेंZonedDateTime
    GregorianCalendar
  • एक विशेष ऑफसेट-यूटीसी में एक पल के लिए , उपयोग (विरासत वर्गों में कोई समकक्ष नहीं)OffsetDateTime
  • अज्ञात समय क्षेत्र या ऑफसेट के साथ दिनांक-समय (एक पल नहीं) के लिए, उपयोग (विरासत वर्गों में कोई समकक्ष नहीं)LocalDateTime

जावा में सभी तिथि-समय प्रकारों की तालिका, दोनों आधुनिक और विरासत

विवरण

Ortomala द्वारा उत्तर Lokni आधुनिक उपयोग करने का सुझाव करने के लिए सही है java.time बल्कि परेशानी पुराने विरासत तिथि-समय वर्गों (से कक्षाएं Date, Calendar, आदि)। लेकिन वह उत्तर गलत वर्ग को समकक्ष बताता है (उस उत्तर पर मेरी टिप्पणी देखें)।

Java.time का उपयोग करना

Java.time कक्षाएं विरासत तिथि-समय की कक्षाओं, रात और दिन के अंतर पर एक बड़ा सुधार हैं। पुरानी कक्षाएं खराब तरीके से डिजाइन की गई हैं, भ्रामक और परेशानी भरी हैं। आपको जब भी संभव हो पुरानी कक्षाओं से बचना चाहिए। लेकिन जब आपको पुराने / नए से / में परिवर्तित करने की आवश्यकता होती है, तो आप पुराने वर्गों में नए तरीकों को जोड़कर ऐसा कर सकते हैं ।

रूपांतरण के बारे में अधिक जानकारी के लिए, मेरा उत्तर और निफ्टी आरेख किसी अन्य प्रश्न पर देखें, java.util में कनवर्ट करें। "java.time" प्रकार क्या है?

स्टैक ओवरफ्लो की खोज java.time का उपयोग करने पर कई सैकड़ों उदाहरण प्रश्न और उत्तर देता है। लेकिन यहाँ एक त्वरित सारांश है।

Instant

एक के साथ वर्तमान क्षण प्राप्त करें InstantInstantकक्षा में समय रेखा पर एक पल का प्रतिनिधित्व करता यूटीसी के एक संकल्प के साथ नैनोसेकंड (नौ (9) एक दशमलव भिन्न के अंकों के लिए)।

Instant instant = Instant.now();

ZonedDateTime

किसी विशेष क्षेत्र की दीवार-घड़ी के समय के लेंस के माध्यम से एक ही समय में एक साथ देखने के लिए , एक समय क्षेत्र ( ) प्राप्त करने के लिए एक समय क्षेत्र लागू करें ।ZoneIdZonedDateTime

समय क्षेत्र

के रूप में , या , के प्रारूप में एक उचित समय क्षेत्र नाम निर्दिष्ट करें । कभी इस तरह के रूप में 3-4 पत्र संक्षिप्त नाम का उपयोग या के रूप में वे कर रहे हैं नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();

ओफ़्सेट

एक समय क्षेत्र अपने ऑफसेट-यूटीसी से परिवर्तनों का एक क्षेत्र है । लेकिन कभी-कभी आपको पूरे क्षेत्र के बिना केवल एक ऑफसेट दिया जाता है। उस स्थिति में, OffsetDateTimeकक्षा का उपयोग करें ।

ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );

एक समय क्षेत्र का उपयोग एक मात्र ऑफसेट के उपयोग से बेहतर है।

LocalDateTime

Local…कक्षाओं में "स्थानीय" का अर्थ किसी भी इलाके से है, न कि किसी विशेष इलाके से। तो नाम प्रति-सहज हो सकता है।

LocalDateTime, LocalDateऔर LocalTimeऑफसेट या टाइम ज़ोन के बारे में किसी भी जानकारी का अभाव है। इसलिए वे वास्तविक क्षणों का प्रतिनिधित्व नहीं करते हैं, वे समयरेखा पर अंक नहीं हैं । जब संदेह या असमंजस में हों, ZonedDateTimeबजाय इसके उपयोग करें LocalDateTime। अधिक चर्चा के लिए स्टैक ओवरफ्लो खोजें।

स्ट्रिंग्स

तारीख-समय ऑब्जेक्ट्स को उन स्ट्रिंग्स के साथ भ्रमित न करें जो उनके मूल्य का प्रतिनिधित्व करते हैं। आप दिनांक-समय ऑब्जेक्ट प्राप्त करने के लिए एक स्ट्रिंग पार्स कर सकते हैं, और आप दिनांक-समय ऑब्जेक्ट से स्ट्रिंग उत्पन्न कर सकते हैं। लेकिन स्ट्रिंग कभी भी स्वयं दिनांक नहीं है।

Java.time कक्षाओं में डिफ़ॉल्ट रूप से उपयोग किए जाने वाले मानक आईएसओ 8601 प्रारूपों के बारे में जानें ।


जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

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

JDBC 4.2 के साथ या बाद में JDBC ड्राइवर के अनुपालन का उपयोग करते हुए , आप सीधे java.time ऑब्जेक्ट्स को अपने डेटाबेस से एक्सचेंज कर सकते हैं । तार या जावा की जरूरत नहीं है। वर्ग *। कक्षाएं।

Java.time कक्षाएं कहाँ से प्राप्त करें?

जावा या एंड्रॉइड के किस संस्करण के साथ उपयोग करने के लिए किस java.time लाइब्रेरी की तालिका

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


10

जावा 8 के साथ, नए java.time पैकेज का उपयोग किया जाना चाहिए।

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

आप इस तरह ZonedDateTimeएक पुरानी java.util.Dateवस्तु से एक वस्तु बना सकते हैं :

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

Java.time कक्षाओं का सुझाव देने के लिए अच्छा है। लेकिन सुझाव देना बुरा है LocalDateTime। वह वर्ग जानबूझकर ऑफसेट-यूटीसी और समय क्षेत्र के बारे में कोई भी जानकारी खो देता है। इसलिए वह वर्ग समतुल्य नहीं है जैसा Dateकि यूटीसी में है और Calendarउसका नियत समय क्षेत्र है। देखें मेरे जवाब और निफ्टी आरेख एक और सवाल करने के लिए, क्या "java.time" प्रकार के java.util.Date कन्वर्ट?
तुलसी बोर्क

9

मैं हमेशा जोडा-टाइम की वकालत करता हूं । यहाँ पर क्यों।

  1. एपीआई सुसंगत और सहज है। Java.util.Date/Calendar API के विपरीत
  2. यह java.text.SimpleDateFormat आदि के विपरीत, थ्रेडिंग मुद्दों से ग्रस्त नहीं है (मैंने कई क्लाइंट मुद्दों को यह महसूस करने से संबंधित नहीं देखा है कि मानक दिनांक / समय स्वरूपण थ्रेड-सुरक्षित नहीं है)
  3. यह जावा 8 के लिए निर्धारित नई जावा तिथि / समय एपीआई ( JSR310 ) का आधार है , इसलिए आप एपीआई का उपयोग करेंगे जो कोर जावा एपीआई बन जाएगा।

संपादित करें: जावा 8 के साथ शुरू की गई जावा तिथि / समय कक्षाएं अब पसंदीदा समाधान हैं, यदि आप जावा 8 में माइग्रेट कर सकते हैं


3
पिछली बार जब मैंने देखा, तो Joda और JSR-310 बहुत अलग दिख रहे थे, भले ही वे दोनों स्टीफन कोलबोर्न द्वारा लिखे गए हों। उस ने कहा, जोडा आपको तारीख-समय की समस्याओं की जटिलता से
परिचित कराएगा

2
चूँकि यह सवाल थर्ड पार्टी लाइब्रेरी का उपयोग न करके डेट और कैलेंडर का उपयोग करने के बारे में था, जो किसी प्रोजेक्ट के लिए एकल विक्रेता निर्भरता जोखिम जोड़ता है।
आर्किमिडीज ट्रेजानो

2
मैं सबसे अच्छा अभ्यास रखता हूं बस उन वर्गों का उपयोग नहीं करना है
ब्रायन एग्न्यू

3
Java.util.Date और कैलेंडर कक्षाओं के साथ ज्ञात समस्याओं को देखते हुए, जोडा-टाइम (या JSR 310) का सुझाव देना मेरे लिए उचित और जिम्मेदार लगता है। हम स्वाद या सौंदर्य शैली के बारे में बात नहीं कर रहे हैं। अगर किसी ने पूछा कि क्या उन्हें लाल कार या चांदी की कार लेनी चाहिए, और मुझे पता था कि लाल कार में एक फ्लैट टायर है और चांदी की कार में एक बस्टेड रेडिएटर है, तो क्या मुझे कार लेनी चाहिए या मुझे टैक्सी बुलाने का सुझाव देना चाहिए? उस प्रश्न का उत्तर आजकल स्पष्ट प्रतीत होना चाहिए क्योंकि यहां तक ​​कि सन / ओरेकल ने भी उन जंकरों को पीछे छोड़ने और एक नई कार खरीदने का फैसला किया: जेएसआर 310: तिथि और समय एपीआई।
बेसिल बोर्के Bas

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

8

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


1

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

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

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

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


तथ्य यह है कि आप समय में एक ही पल स्टोर कर सकते हैं, लेकिन विभिन्न कैलेंडर सिस्टम के आधार पर अलग-अलग घंटे / मिनट / दिन / सप्ताह / वर्ष / फू की रिपोर्ट करते हैं, एक ताकत है, कमजोरी नहीं। यह (जटिल) वास्तविकता को दर्शाता है।
थ्रॉन्का

वास्तव में, Dateफिर से विकसित किया गया है; java.time.Instantकक्षा द्वारा प्रतिस्थापित किया गया । और Calendar/ वर्ग GregorianCalendarद्वारा प्रतिस्थापित किया गया था java.time.ZonedDateTime
तुलसी बॉर्क

0

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

ऐसा लगता है कि यह केवल नई तिथि (इंट वर्ष, इंट महीने, इंट डे) के माध्यम से कंस्ट्रक्टर की एक समस्या है , अनुशंसित तरीका कैलेंडर के माध्यम से है और अलग से सेट परमर्स .. ( कैलेंडर कैल = Calendar.getInstance (); )


0

मैं कैलेंडर का उपयोग तब करता हूं जब मुझे समय के साथ तारीखों पर कुछ विशिष्ट संचालन की आवश्यकता होती है, लेकिन दिनांक मुझे यह तब उपयोगी लगती है जब आपको अपनी आवश्यकताओं को अनुकूलित करने के लिए तारीख को प्रारूपित करने की आवश्यकता होती है, हाल ही में मुझे पता चला कि लोकेल के बहुत सारे उपयोगी संचालन और तरीके हैं। मैं अभी लोकेल का उपयोग कर रहा हूँ!


FYI करें, परेशानी Calendarऔर Dateकक्षाएं सालों पहले java.time कक्षाओं द्वारा दबा दी गई थीं । कभी भी उपयोग Dateया करने की आवश्यकता नहीं है Calendar। और Localeतारीख-समय की वस्तुओं के अर्थों से कोई लेना-देना नहीं है। एक Localeका उपयोग केवल मानव भाषा और सांस्कृतिक मानदंडों को निर्दिष्ट करने के लिए किया जाता है, जो कि स्थानीयकरण में उपयोग किए जाने वाले समय-वस्तु के मूल्य का प्रतिनिधित्व करने के लिए पाठ का निर्माण करते हैं।
तुलसी बॉर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.