2016-06-27 3 views
7

में दो तिथियों के बीच के दिनों की गणना करें मुझे दो तिथियों के बीच दिनों की संख्या की गणना करने की आवश्यकता है और मैं नीचे कोड का उपयोग कर रहा हूं। समस्या यह है कि यह मुझे वापस कर रहा है 2 लेकिन असल में यह 3 वापस आना चाहिए क्योंकि 30 जून 2016 से 27 जून के बीच का अंतर 3 है। क्या आप कृपया मदद कर सकते हैं कि इसमें वर्तमान तिथि और अंतर में शामिल होना चाहिए?जावा

public static long getNoOfDaysBtwnDates(String expiryDate) { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
    Date expDate = null; 
    long diff = 0; 
    long noOfDays = 0; 
    try { 

     expDate = formatter.parse(expiryDate); 
     //logger.info("Expiry Date is " + expDate); 
     // logger.info(formatter.format(expDate)); 

     Date createdDate = new Date(); 
     diff = expDate.getTime() - createdDate.getTime(); 
     noOfDays = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); 
     long a = TimeUnit.DAYS.toDays(noOfDays); 
     // logger.info("No of Day after difference are - " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS)); 
     System.out.println(a); 
     System.out.println(noOfDays); 

    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return noOfDays; 
} 

समाप्ति की तारीख 2016/06/30 है और आज की तारीख 2016-06-27

+0

@AngryJS मेरा जवाब चेकआउट करें! –

उत्तर

7

कारण है, तो आप एक ही समय प्रारूप के साथ दो तिथियों को घटाकर नहीं कर रहे हैं।

कैलेंडर तिथि का उपयोग समय के लिए 00:00:00 के रूप में बदलने के लिए करें और आपको दिनों में सटीक अंतर मिलेगा। में

Date createdDate = new Date(); 
Calendar time = Calendar.getInstance(); 
time.set(Calendar.HOUR_OF_DAY, 0); 
time.set(Calendar.MINUTE, 0); 
time.set(Calendar.SECOND, 0); 
time.set(Calendar.MILLISECOND, 0); 
createdDate = time.getTime(); 

अधिक explaination जिम गैरीसन 'answer

+0

बस ऐसा किया और तैनात किया :)। – AngryJS

3

समस्या यह है कि

Date createdDate = new Date(); 

सेट वर्तमान तत्काल को createdDate, वह यह है कि है इसमें वर्तमान समय के साथ-साथ तिथि भी शामिल है। जब आप दिए गए प्रारूप का उपयोग करके स्ट्रिंग को पार्स करते हैं, तो समय 00:00:00 पर शुरू किया जाता है।

मान लीजिए कि आप वास्तव में 18:00 स्थानीय समय इस भाग गया है, आप

createdDate = 2016-06-27 18:00:00.000 
expDate  = 2016-06-30 00:00:00.000 

अंतर 2 दिन 6 घंटे, नहीं 3 दिन है के साथ खत्म।

आपको जावा 8 से नए java.time.* कक्षाओं का उपयोग करना चाहिए। एक कक्षा LocalDate है जो समय-समय पर तिथियों का प्रतिनिधित्व करती है। इसमें वर्तमान दिनांक प्राप्त करने के लिए प्रारूप के लिए पार्सिंग के लिए विधियों और LocalDate.now() के साथ-साथ LocalDate उदाहरणों के बीच अंतराल की गणना के तरीकों को शामिल किया गया है।

+0

फिर मैं इसे कैसे ठीक कर सकता हूं? ताकि अगर मैं 30 जून के रूप में समाप्ति में प्रवेश करता हूं, तो उसे केवल 3 दिनों की संख्या देनी चाहिए, जो वास्तव में समय के बीच अंतर की गणना करता है। – AngryJS

+0

मेरा अद्यतन उत्तर देखें। –

0

Calendar.get(Calendar.DAY_OF_MONTH) के रूप में अजगर से कहा का उपयोग करना:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
Date expDate = null; 
String expiryDate ="2016-06-30"; 
int diff = 0; 
try { 
    expDate = formatter.parse(expiryDate); 
    //logger.info("Expiry Date is " + expDate); 
    // logger.info(formatter.format(expDate)); 
    Calendar cal = Calendar.getInstance(); 
    int today = cal.get(Calendar.DAY_OF_MONTH); 
    cal.setTime(expDate); 
    diff = cal.get(Calendar.DAY_OF_MONTH)- today; 

} catch (ParseException e) { 
    e.printStackTrace(); 
} 
System.out.println(diff); 
+1

अच्छा और सुरुचिपूर्ण समाधान लेकिन jdk6 के बाद getDay विधि को बहिष्कृत किया गया है। पदावनत। जेडीके संस्करण 1.1 के अनुसार, कैलेंडर.get (कैलेंडर। DAY_OF_MONTH) द्वारा प्रतिस्थापित किया गया। – PyThon

+0

संपादित किया गया मेरा उत्तर –

+0

अभी ठीक दिखता है, cal.setTime (expDate), यह अच्छा था! – PyThon

5

LocalDate का उपयोग क्यों नहीं?

import java.time.LocalDate; 
import static java.time.temporal.ChronoUnit.DAYS; 

long diffInDays(LocalDate a, LocalDate b) { 
    return DAYS.between(a, b); 
}