2011-10-06 29 views
27

को अनदेखा करते हुए, दो तिथियों के केवल समय के हिस्से की तुलना करें, दो दिनांक वस्तुओं को दी जाने वाली अच्छी विधि क्या है, केवल अपने समय के बीच के अंतर की तुलना करें, पूरी तरह से वर्ष, महीना और दिन को अनदेखा कर दें?दिनांक दिनांक

यह this question के विपरीत है।

अद्यतन: यहाँ भविष्य में संदर्भ के लिए अंतिम कोड है:

private long differenceBetween(Date currentTime, Date timeToRun) 
{ 
    Calendar currentCal = Calendar.getInstance(); 
    currentCal.setTime(currentTime); 

    Calendar runCal = Calendar.getInstance(); 
    runCal.setTime(timeToRun); 
    runCal.set(Calendar.DAY_OF_MONTH, currentCal.get(Calendar.DAY_OF_MONTH)); 
    runCal.set(Calendar.MONTH, currentCal.get(Calendar.MONTH)); 
    runCal.set(Calendar.YEAR, currentCal.get(Calendar.YEAR)); 

    return currentCal.getTimeInMillis() - runCal.getTimeInMillis(); 
} 
+2

हाँ, यह करता है। ऐसा क्यों नहीं होगा? – kolrie

+0

इस समाधान की विडंबना यह है कि आप दो वस्तुओं को लेते हैं जो लंबे समय तक एक प्राचीन प्रकार के पतले रैपर होते हैं, लंबे समय से कैलेंडर ऑब्जेक्ट्स में कनवर्ट करने के लिए एक विशाल और जटिल एपीआई का आह्वान करते हैं ... केवल उस स्थान पर वापस आते हैं जहां आप ' कैलेंडर ऑब्जेक्ट्स से फिर से लंबे समय तक कनवर्ट करना। – scottb

+0

@scottb - नीचे देखें [मेरा जवाब] (http://stackoverflow.com/questions/7676149#7676307), जो 'कैलेंडर' ऑब्जेक्ट्स के साथ गड़बड़ नहीं करता है लेकिन केवल 'दिनांक' सदस्यों का उपयोग करता है। –

उत्तर

29

आप अंतर्निहित बाइनरी (लंबी पूर्णांक) दिनांकों के मूल्यों की तुलना करना चाहते हैं, तो आप ऐसा कर सकते हैं:

public int compareTimes(Date d1, Date d2) 
{ 
    int  t1; 
    int  t2; 

    t1 = (int) (d1.getTime() % (24*60*60*1000L)); 
    t2 = (int) (d2.getTime() % (24*60*60*1000L)); 
    return (t1 - t2); 
} 

Addendum 1

इस तकनीक में गति का लाभ है, क्योंकि यह Date वस्तुओं के अंतर्निहित long मूल्य का उपयोग करता है, बजाय टिक और कैलेंडर घटकों (जो कि महंगा और धीमा है) के बीच परिवर्तित करने के बजाय। यह Calendar ऑब्जेक्ट्स के साथ गड़बड़ करने से भी बहुत आसान है।

परिशिष्ट 2

कोड के ऊपर एक int है, जो, कितनी भी बार जोड़ी के लिए सही हो जाएगा के रूप में समय अंतर देता है के बाद से यह तारीखों के वर्ष/माह/दिन भाग पूरी तरह से अनदेखा, और किसी भी दो बार के बीच अंतर 86,400,000   एमएस (=   1000 एमएस/सेकंड × 60 सेकंड/मिनट × 60 मिनट/घंटा × 24 घंटे/दिन) से अधिक नहीं है।

+0

यह सबसे अच्छा जवाब है, आईएमओ। डेट ऑब्जेक्ट्स के भीतर समय मानों की तुलना करने के लिए जटिल कैलेंडर API का उपयोग करने की आवश्यकता नहीं है। – scottb

+0

यह सही और स्मार्ट –

+0

thnx डेविड है, ठीक वही है जो मैं देख रहा था :) –

5

Calendar वर्ग पर एक नजर डालें। Date के दिए गए घंटों, मिनटों और सेकंड निकालने के लिए इसका समर्थन है।

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(yourDateObject); 
int hour = calendar.get(Calendar.HOUR); 
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
+0

कैलेंडर। HOUR_OF_DAY अधिक उपयुक्त है (12 से 24 घंटे) – IHeartAndroid

1

मामले आप JODA उपयोग नहीं कर सकते में,

को 0.

उन्हें तुलना करें 2 कैलेंडर वस्तुओं, सेट साल बनाने के लिए, माह और दिन ....

19

आप कर सकते हैं एक तुलनात्मक के लिए जोडा समय के DateTimeComparator.getTimeOnlyInstance() का उपयोग करने पर विचार करें जो कि समय पर आधारित दो जोडा तिथियों की तुलना करेगा।

उदाहरण के लिए:

DateTimeComparator comparator = DateTimeComparator.getTimeOnlyInstance(); 
comparator.compare(date1, date2); 

देखें http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeComparator.html#getTimeOnlyInstance()

+0

यदि (जावा) समय प्रश्न है, तो जोडा उत्तर है: डी – bbaja42

+0

@ bbaja42 आप जीडब्ल्यूटी का उपयोग नहीं करते हैं:/ – displayname

1

यदि जोडा कोई विकल्प नहीं है, तो सबसे कम दृष्टिकोण में से एक संभवतः समय को स्ट्रिंग में परिवर्तित करना है और फिर उनकी तुलना करना है।

DateFormat df = new SimpleDateFormat("HHmmssSZ"); 
df.format(date1).equals(df.format(date2)); 
0

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

function CompareTimes(d1, d2) { 
      if (d1.getHours() < d2.getHours()) { 
       return false; 
      } 
      if (d1.getHours() > d2.getHours()) { 
       return true; 

      } else { 
       return (d1.getMinutes() > d2.getMinutes()); 
      } 
}; 
0

अगर आप सिर्फ तारीखों के समय भाग की तुलना करना चाहते तो यह आपके सही परिणाम देना होगा -

public long compareTimes(Date d1, Date d2) 
    { 
     long  t1; 
     long  t2; 
     t1 = d1.getHours()*60*60+d1.getMinutes()*60+d1.getSeconds(); 
     t2 = d2.getHours()*60*60+d2.getMinutes()*60+d2.getSeconds(); 
     long diff = t1-t2; 
     System.out.println("t1 - "+t1+", t2 - "+t2+", diff - "+diff); 

     return diff; 
    } 
संबंधित मुद्दे