2011-11-21 19 views
16

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

हालांकि, मैं जिस कोड का उपयोग कर रहा हूं वह काम नहीं कर रहा है। मैं "11/21/2011 7:00:00 पूर्वाह्न" और "11/21/2011 1:00:00 अपराह्न" (जो 360 मिनट होना चाहिए) के बीच मिनटों की संख्या प्राप्त करने का प्रयास कर रहा हूं, लेकिन कोड I मैं रिटर्न का उपयोग कर रहा हूं 0:

int diff = minutesDiff(GetItemDate("11/21/2011 7:00:00 AM"), GetItemDate("11/21/2011 1:00:00 PM")); 

public static Date GetItemDate(final String date) 
{ 
    final Calendar cal = Calendar.getInstance(TimeZone.getDefault()); 
    final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a"); 
    format.setCalendar(cal); 

    try { 
     return format.parse(date); 
    } catch (ParseException e) { 
     return null; 
    } 
} 

public static int minutesDiff(Date earlierDate, Date laterDate) 
{ 
    if(earlierDate == null || laterDate == null) return 0; 

    return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 
} 
+0

यह करता है? यह मेरे लिए नहीं है। इसके अलावा, आप विभाजन दो बार क्यों कर रहे हैं? –

+2

यह मेरे लिए बिल्कुल ठीक काम करता है। आउटपुट -360 है। – Tyler

+0

मुझे नहीं पता कि आप शून्य क्यों प्राप्त कर रहे हैं, लेकिन आपकी प्रारूप स्ट्रिंग गलत है। एचएच 0 और 23 के बीच के घंटे के लिए प्रारूप है, लेकिन चूंकि आपके पास एक प्रारूप चरित्र भी है, इसलिए मुझे लगता है कि आप 1 और 12 के बीच का समय चाहते हैं, और आपको एचएच का उपयोग करना चाहिए। वर्तमान में, आपके 1:00:00 अपराह्न को 1:00:00 बजे के रूप में पार्स किया जा रहा है। – Brigham

उत्तर

5

मैं अपने कोड के माध्यम से डिबग:

Unparseable तारीख: 2011/11/21 07:00:00

ParseException तरह तारीख तार दोनों के लिए GetItemDate() में होती है समस्या यह है कि एएम/पीएम घंटे पार्सिंग केवल "एचएच" (छोटे कैप्स!) या "केके" के साथ काम करता है। कम से कम मेरे फोन में यह मामला है (ऐसा लगता है कि हम में से कुछ ने इस मुद्दे को बिल्कुल नहीं देखा)। मैंने परीक्षण किया कि यह भी एक "एच" के साथ काम करता है।

hh = 1-12
केके = 0-11
एचएच = 0-23
केके = 1-24

इस के लिए अपने SimpleDateFormat लाइन बदलने के लिए:

final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US); 


यह पोस्ट "ए" और Locale: Unable to parse DateTime-string with AM/PM marker

पीएस बताता है। मैं फिनलैंड से हूं इसलिए मुझे काम करने के लिए "लोकेल.यूएस" भाग का उपयोग करना होगा। अमेरिकी निवासियों के बिना कोड का परीक्षण कर सकते हैं, मुझे लगता है।

13

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

इसके अलावा, सिर्फ अभ्यास की बात के रूप में, मैं बदल देंगे:

return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 

रहे हैं:

long result = ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 
return (int) result; 

यह आपको एक आईडीई में गणित के परिणाम देखने के लिए अवसर देता है।

+4

कई (सबसे अधिक?) आईडीई में फ़ंक्शन रिटर्न मान देखने की क्षमता है, इसलिए उस उद्देश्य के लिए स्थानीय * बस * बनाना आवश्यक नहीं होना चाहिए। मैं अभी भी विभाजन दो बार नहीं करता। –

+0

दो बार विभाजन नहीं करने पर अच्छा कॉल। मैंने भी ध्यान नहीं दिया। – Thom

+0

आप शायद 'int' पर कास्टिंग करने के लिए गोल करने के बेहतर हैं लेकिन यह निश्चित रूप से आपके इरादे पर निर्भर करता है। 2 मिनट 59 सेकंड और 4 मिनट 0 सेकंड 5 सेकंड से 2 मिनट के अंतर के करीब 59 सेकंड है। – Tom

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