2009-10-01 11 views
14

तुलना तिथियों का एक मान्य तरीका है:क्या मुझे तिथियों की तुलना करने के लिए Calendar.compareTo() का उपयोग करना चाहिए?

Calendar someCalendar1 = Calendar.getInstance(); // current date/time 
someCalendar1.add(Calendar.DATE, -14); 

Calendar someCalendar2 = Calendar.getInstance(); 
someCalendar2.setTime(someDate); // someDate is in the format of MM/dd/yyyy 

if(someCalendar2.compareTo(someCalendar1) < 0){ 
    ...Code...    
} 

... या वहाँ एक बेहतर तरीका है?

उत्तर

17

Date ही तुलनीय लागू करता है तो वहाँ कैलेंडर में लपेट के लिए कोई कारण नहीं है:

:

Calendar someCalendar1 = Calendar.getInstance(); // current date/time 
someCalendar1.add(Calendar.DATE, -14); 

if (someDate.compareTo(someCalendar1.getTime()) < 0) { 
    ...Code...       
} 

तिथि भी है कि इसके बाद के संस्करण तुलना को आसान बनाने के पढ़ने के लिए सुविधाजनक after() और before() तरीकों है

if (someDate.before(someCalendar1.getTime())) { 
    ...Code...       
} 

अंत में, यदि आप तिथि/समय से निपट रहे हैं बहुत कुछ, अंतर्निहित जावा कक्षाओं के बजाय Joda Time का उपयोग करने पर विचार करें। यह अधिक सुविधाजनक और कार्यात्मक है:

DateTime dt = new DateTime().minusWeeks(2); 
if (new DateTime(someDate).isBefore(dt)) { 
    ...Code...       
} 
+0

धन्यवाद एक गुच्छा .. :) –

+0

यदि आप बस तारीख की तुलना करते हैं, तो क्या आप अपना पूरा टाइमज़ोन डेटा खोना नहीं चाहते हैं, और इस प्रकार गलत जवाब मिलता है जब तक कि दोनों कैलेंडर एक ही समय क्षेत्र में न हों? मूल्य/स्वरूपण –

7

यह वैध है, लेकिन आप थोड़ा someDate लेकर असमंजस में हैं - Calendar.setTime एक java.util.Date लेता है, जो एक long के बाद आधी रात जनवरी 1st 1970 मिलीसेकेंड की संख्या का संकेत चारों ओर सिर्फ एक आवरण है, यु.टी. सी। यह "एमएम/डीडी/yyy प्रारूप में नहीं है" - यह एक स्ट्रिंग प्रतिनिधित्व है, java.util.Date नहीं। यदि MM/dd/yyyy प्रारूप में कुछ प्रिंट करना होता है, तो यह केवल Date.toString आपके लिए कर रहा है - यह प्रारूप का स्वाभाविक रूप से हिस्सा नहीं है।

एक तरफ, मैं व्यक्तिगत रूप से अनुशंसा करता हूं कि आप java.util.Date और java.util.Calendar से पूरी तरह से बचें और इसके बजाय Joda Time का उपयोग करें। यह अधिक बेहतर API है।

+0

+1 कूल .. धन्यवाद .. :) – pmu

+0

कूल के बीच अंतर के लिए –

+0

+1 जोडा समय की सिफारिश करने के लिए +1! – spaaarky21

0

यह ठीक है। इसके अलावा, आप से पहले() और के बाद() का उपयोग कर सकते हैं:

package demo.so; 

import java.util.Date; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

public class Tester { 

    public static void main(String[] args) throws Exception { 

    Calendar someCalendar1 = Calendar.getInstance(); // current date/time 
    someCalendar1.add(Calendar.DATE, -11); 

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
    Date someDate = df.parse("10/08/2009"); 

    Calendar someCalendar2 = Calendar.getInstance(); 
    someCalendar2.setTime(someDate); 

    String cal1 = df.format(someCalendar1.getTime()); 
    String cal2 = df.format(someCalendar2.getTime()); 

    if (someCalendar1.equals(someCalendar2)) 
     System.out.println(cal1 + " is the same as " + cal2); 
    if (someCalendar1.after(someCalendar2)) 
     System.out.println(cal1 + " is after " + cal2); 
    if (someCalendar1.before(someCalendar2)) 
     System.out.println(cal1 + " is before " + cal2); 

    } 

} 

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

2

एक उदाहरण के रूप में जोडा बेहतर क्यों है, डेलाइट सेविंग टाइम ले लो।

यदि आप "एक दिन" 1000 * 60 * 60 * 24 मिलीसेकंड के रूप में माप रहे हैं, दिनांक लाइब्रेरी - और कैलेंडर लाइब्रेरी - दोनों भूल जाते हैं कि 25 घंटे के साथ वर्ष में एक दिन और दूसरा 23 के साथ है। यदि आप जे 2 एसई एपीआई में बनाए गए जावा क्लास पर भरोसा करते हैं तो आप कभी-कभी डेट गणना को खराब कर देंगे।

जोडा जावा के भविष्य के संस्करण में ग्रेगोरियन कैलेंडर, कैलेंडर और दिनांक के लिए ड्रॉप-इन प्रतिस्थापन होने की आधा होने की संभावना है।

+0

जेएसआर -310 बिल्कुल जोडा के समान नहीं है, हालांकि यह वही व्यक्ति द्वारा भाले की अध्यक्षता के कारण बहुत समान है। यह पर्याप्त आईएमओ तक नहीं पहुंच सकता है। –

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