2009-01-17 1 views
17

में तारीखों में अंतर की गणना करना मुझे यह अजीब लगता है कि जावा (या java.util लाइब्रेरी) में तिथियों में अंतर की गणना करने के लिए अंतर्निहित फ़ंक्शन नहीं है। मैं उनके बीच का समय बीतने के लिए एक तारीख से दूसरे तारीख को घटाना चाहता हूं। इसे करने का बेहतरीन तरीका क्या है?जावा

मुझे पता है कि मिलीसेकंड में समय का अंतर लेना और फिर इसे दिनों में परिवर्तित करना आसान तरीका है। हालांकि, मैं जानना चाहता था कि यह सभी मामलों में काम करता है (डेलाइट सेविंग आदि के साथ)।

+2

कुछ पृष्ठभूमि के लिए http://www.xmission.com/~goodhill/dates/deltaDates.html देखें। –

+0

यह एक अच्छा लेख है। धन्यवाद! – Anirudh

+0

@ अनीरुध खोज स्टैक ओवरफ्लो "जोडा" और "स्पैन", "अंतराल", "अवधि", "अवधि" जैसे शब्द। आपको चर्चा के साथ कई उदाहरण मिलेंगे। –

उत्तर

6

मैं जानता हूँ कि सरल तरीका मिलीसेकेंड में समय की अंतर ले और फिर परिवर्तित कि दिन में किया जा सके। हालांकि, मैं जानना चाहता था कि यह सभी मामलों में काम करता है (डेलाइट बचत आदि के साथ)।

अपने समय UTC दिनांक से प्राप्त कर रहे हैं, या वे System.getCurrentTimeMillis() एक ही सिस्टम पर मापा जाता करने के लिए दो कॉल के बीच बस फर्क हैं, तो आप अंतर के रूप में मिलीसेकंड का कोई मान्य संख्या, के स्वतंत्र मिल जाएगा किसी भी समय क्षेत्र मुद्दों। (यही कारण है कि सब कुछ यूटीसी को भंडारण प्रारूप के रूप में उपयोग करना चाहिए - यूटीसी-> स्थानीय समय से जाना बहुत आसान है; यदि आप दूसरी तरफ जाने का प्रयास करते हैं तो आपको स्थानीय समय के साथ स्थानीय टाइमज़ोन को स्टोर करने की आवश्यकता है - या इसका अनुमान लगाने का प्रयास करें, गैक!)

इसे कई दिनों में बदलने के लिए, आपको केवल 86400000 तक विभाजित करने में सक्षम होना चाहिए ... चेतावनी के साथ कि हर दूसरे वर्ष या तो कभी-कभी leap second होता है।

8

यदि आप ओपन सोर्स को देखते हैं तो जावा में बहुत कुछ नहीं गुम है: Joda-Time आज़माएं।

+3

जावा तिथि के बारे में प्रश्न ==> उत्तर जोडा का उल्लेख है! –

+1

हां, जिस तरह से यह काम करता है जब किसी भाषा में 2 दोष दिनांक/समय कक्षाएं होती हैं। – krosenvold

+0

मैंने जोडा को देखा - दुर्भाग्य से, मुझे गैर-मानक पुस्तकालयों का उपयोग करने की अनुमति नहीं है :( – Anirudh

0

मैं दावा है कि जावा तिथियों के बीच के अंतर की गणना के लिए एक तंत्र की जरूरत नहीं है से असहमत: आप Joda-Time जटिल मिल जाए, स्रोत खोलने के लिए मेरी छोटी योगदान प्रयास करें।

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

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

कहा जा रहा है कि इस तरह की कार्यक्षमता के कई कार्यान्वयन हैं, मुझे लगता है कि दूसरों ने उदाहरण प्रदान किए हैं।

+0

मैं सिद्धांत रूप से आपसे सहमत हूं। जावा का मेरा दावा यह कार्यक्षमता नहीं है इस तथ्य पर आधारित था कि अन्य भाषाओं (रूबी, पायथन, आदि) मानक दिनांक कक्षाओं के हिस्से के रूप में तारीखों को जोड़ने और घटाने का एक बहुत ही सरल (और कामकाजी) कार्यान्वयन है। – Anirudh

2
date4j पुस्तकालय के साथ

:

int numDaysBetween = oneDate.numDaysFrom(anotherDate); 
1

इसे लागू करने के लिए सरल तरीका है। हम लूप के साथ calendar.add विधि का उपयोग कर सकते हैं। नीचे के रूप में उदाहरण के लिए,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

Date beginDate = dateFormat.parse("2013-11-29"); 
Date endDate = dateFormat.parse("2013-12-4"); 

Calendar beginCalendar = Calendar.getInstance(); 
beginCalendar.setTime(beginDate); 

Calendar endCalendar = Calendar.getInstance(); 
endCalendar.setTime(endDate); 
BeginDate और ENDDATE, और नीचे के रूप में कोड के बीच शून्य दिनों

,

int minusDays = 0; 
while (true) { 
    minusDays++; 

    // Day increasing by 1 
    beginCalendar.add(Calendar.DAY_OF_MONTH, 1); 

    if (dateFormat.format(beginCalendar.getTime()). 
      equals(dateFormat.format(endCalendar).getTime())) { 
    break; 
    } 
} 
System.out.println("The substractation between two days is " + (minusDays + 1)); 

Have मज़ा! @। @

+0

मैंने पहले इस विधि का उपयोग किया है। हालांकि, यह रनटाइम ओ (एन) है, जहां एन प्रारंभ दिनांक और एंडडेट के बीच दिनों की संख्या है। मुझे लगता है कि जोडाटाइम का उपयोग बेहतर परिणाम देगा। – jharig23

+0

हाँ, आप सही हैं। लेकिन मुझे लगता है कि ओ (एन) कुछ परियोजनाओं के लिए स्वीकार्य है। क्योंकि मैं कुछ lib आयात नहीं करना चाहता हूँ। अभी भी आपके सुझावों के लिए धन्यवाद। –

4

उपयोग या तो Joda समय या जावा में नए java.time पैकेज 8.

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

java.time

java.time ढांचे जावा 8 में बनाया गया और बाद में एक Period वर्ग कई वर्षों से, महीनों की संख्या, और दिनों की संख्या के रूप में समय के अंतराल का प्रतिनिधित्व किया है। लेकिन यह वर्ग पूरे दिनों तक सीमित है, घंटों, मिनटों और सेकंड का कोई प्रतिनिधित्व नहीं।

ध्यान दें कि हम एक समय निर्धारित करने के लिए महत्वपूर्ण समय क्षेत्र निर्दिष्ट करते हैं। उदाहरण के लिए, Montréal की तुलना में Paris में पहले एक नया दिन सामने आया।

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate now = LocalDate.now(zoneId); 
LocalDate then = LocalDate.of(2001, 1, 1); 
Period period = Period.between(then, now); 
फिर

: 2001/01/01। अब: 2015-09-07। अवधि: पी 14Y8M6D। दिन: 5362

पूरे दिनों के लिए, Daylight Saving Time (DST) अप्रासंगिक है।

यदि आप कुल दिनों की गिनती चाहते हैं, तो ChronoUnit enum का उपयोग करें जिसमें कुछ गणना विधियां शामिल हैं। नोटिस की गणना एक लंबी वापसी।

long days = ChronoUnit.DAYS.between(then, now); // "5362" seen above. 

java.time में एक पूर्ण अवधि कर रही है, घंटे, मिनट, सेकंड सहित लगभग I have asked। जावा 8 के रूप में संभव नहीं है। द्वारा बंडल लाइब्रेरी was suggested का उपयोग करके एक आश्चर्यजनक कामकाज: javax.xml.datatype package में मिली Duration कक्षा का उपयोग करें।

Joda समय

यहाँ Joda समय 2.3 में मौजूद कुछ उदाहरण कोड है।

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
DateTime start = new DateTime(2014, 1, 2, 3, 4, 5, timeZone); 
DateTime stop = new DateTime(2014, 5, 2, 3, 4, 5, timeZone); 
Period period = new Period(start, stop); 

कॉलिंग toString आप प्रपत्र ISO 8601 मानक, PnYnMnDTnHnMnS द्वारा परिभाषित में एक स्ट्रिंग प्रतिनिधित्व मिल जाएगा।