2010-01-05 17 views
35

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

जब मैं अपने तिथि वस्तु पर .toString() का उपयोग मैं इस मिल: शुक्र दिसंबर 18 08:08:10 सीएसटी 2009

मैं निम्नलिखित की कोशिश की है:

long diff=(this.endDate.getTime()-this.startDate.getTime())/(60*60 * 1000); 

लेकिन यह केवल मुझे मिनट देता है, मिनटों में नहीं। मुझे पता है कि यह एक साधारण समस्या है, लेकिन मैं इसे एटीएम नहीं समझ सकता।

संपादन: रुचि रखने वालों के लिए अंतिम समाधान। माइकल ब्रेवर-डेविस

Period p = new Period(this.startDate, this.endDate); 
long hours = p.getHours(); 
long minutes = p.getMinutes(); 

String format = String.format("%%0%dd", 2); 

return Long.toString(hours)+":"+String.format(format, minutes); 
+0

कृपया अपना उत्तर @ clang1234 अपडेट करें। यह बहुत भ्रामक है और आसानी से बग पेश कर सकता है। यह कोड केवल उसी दिन काम करता है जब 'स्टार्टडेट' और 'एंडडेट' उसी दिन होते हैं। आपको टिप्पणियों में उल्लिखित के रूप में 'Hours.hours (startTime, endTime) .getHours()' जैसा कुछ करने की आवश्यकता है। – Arjit

उत्तर

57

यह इस प्रकार से Joda time साथ काम करता है:

DateTime startTime, endTime; 
Period p = new Period(startTime, endTime); 
int hours = p.getHours(); 
int minutes = p.getMinutes(); 

आप Joda के formatters, उदाहरण के लिए, PeriodFormat साथ स्वरूपित सकता है, लेकिन मैं जावा के उपयोग करने का सुझाव चाहते हैं। अधिक जानकारी के लिए this question देखें।

+1

यह सिर्फ सही है। जोडा टाइम लिंक के लिए धन्यवाद। लेकिन मैं डिस्प्ले को "एच: एमएम" कैसे प्राप्त करूं जहां एच घंटे और एम मिनट है। उदाहरण के लिए "1:05"। फिलहाल "1: 5" – clang1234

+0

प्रदर्शित होगा जो आपके लिए एक प्रारूपण लिंक जोड़ा गया है। –

+1

अद्भुत। सहायता – clang1234

0

तो getTime() विधि, मुझे लगता है, एक पूर्णांक देता है।

किस मामले में, कोष्ठक के बाएं सेट में टाइप int है, है ना?

और

(60*60*1000) 

भी एक पूर्णांक है।

जिसका अर्थ है कि आप लंबे diff = ((int)/(int) प्राप्त करते हैं) तो पूर्णांक को लंबे समय तक रखने से पहले पूर्णांक विभाजन किया जाता है। और इसलिए आप अपना मिनट खो देते हैं।

विभाजित करने से पहले उन्हें कास्ट करने का प्रयास करें।

+0

GetTime() विधि लंबे समय तक एक int नहीं देता है। – clang1234

+0

आह ... फिर रॉब वैन बांध ने क्या कहा, मुझे लगता है। ग्रेग्स ने भी क्या कहा। –

60

यह काम करना चाहिए।

long secs = (this.endDate.getTime() - this.startDate.getTime())/1000; 
int hours = secs/3600;  
secs = secs % 3600; 
int mins = secs/60; 
secs = secs % 60; 
+3

मुझे यह समाधान पसंद है क्योंकि इसे केवल शुद्ध जावा की आवश्यकता है। मेरे लिए यह पर्याप्त है। – Gondy

8

यहाँ आसान तरीका है:

private static int hoursDifference(Date date1, Date date2) { 

    final int MILLI_TO_HOUR = 1000 * 60 * 60; 
    return (int) (date1.getTime() - date2.getTime())/MILLI_TO_HOUR; 
} 
+0

उपयोग जोडा समय का उपयोग करते समय DateTimeConstants.MILLIS_PER_HOUR – Troveldom

-1

यहाँ सरल विधि है: - अपने Date format की जाँच करें, यदि आपका तारीख नहीं में इस प्रारूप तो यह बदल सकते हैं और इस विधि को पारित तो यह आपको एक String दे देंगे आपका परिणाम कौन सा है। आवश्यकता के अनुसार विधि को संशोधित करें।

private String getDateAsTime(String datePrev) { 
     String daysAsTime = ""; 
     long day = 0, diff = 0; 
     String outputPattern = "yyyy:MM:dd HH:mm:ss"; 
     SimpleDateFormat outputFormat = new SimpleDateFormat(outputPattern); 
     Calendar c = Calendar.getInstance(); 
     String dateCurrent = outputFormat.format(c.getTime()); 
     try { 
      Date date1 = outputFormat.parse(datePrev); 
      Date date2 = outputFormat.parse(dateCurrent); 
      diff = date2.getTime() - date1.getTime(); 
      day = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     if (day == 0) { 
      long hour = TimeUnit.HOURS.convert(diff, TimeUnit.MILLISECONDS); 
      if (hour == 0) 
       daysAsTime = String.valueOf(TimeUnit.MINUTES.convert(diff, TimeUnit.MILLISECONDS)).concat(" minutes ago"); 
      else 
       daysAsTime = String.valueOf(hour).concat(" hours ago"); 
     } else { 
      daysAsTime = String.valueOf(day).concat(" days ago"); 
     } 
     return daysAsTime; 
    } 

आशा इस में मदद मिलेगी,

1

एक टिप्पणी में सोमैया के सुझाव का पालन करें, उपयोग घंटे के बजाय:

घंटे घंटे = Hours.hoursBetween (STARTTIME, ENDTIME);

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

यदि आप समय अंतर को घंटों में बदलने की कोशिश करने के लिए अवधि .toStandardHours() का उपयोग करते हैं तो गणना एक अपवाद फेंक देगी यदि दो तिथियों के बीच का समय अंतर किसी भी वर्ष या महीने में अंतर शामिल है, क्योंकि महीने की लंबाई अज्ञात है ।

संबंधित मुद्दे