2010-06-29 4 views
25

मुझे जावा में दो तिथियों की तुलना करने की आवश्यकता है। मैं इस तरह के कोड का उपयोग कर रहा हूं:जावा में दो तिथियों की तुलना करें

Date questionDate = question.getStartDate(); 
Date today = new Date(); 

if(today.equals(questionDate)){ 
    System.out.println("Both are equals"); 
} 

यह काम नहीं कर रहा है।

  • questionDate शामिल 2010-06-30 00:31:40.0
  • todayWed Jun 30 01:41:25 IST 2010

मैं यह कैसे हल कर सकते हैं शामिल हैं: चर की सामग्री निम्नलिखित है?

उत्तर

41

दिनांक समानता मिलीसेकंड के बराबर होने वाली दो तिथियों पर निर्भर करती है। new Date() का उपयोग कर एक नई दिनांक वस्तु बनाना अतीत में बनाए गए दिनांक के बराबर कभी नहीं होगा। Joda Time के एपीआई तिथियों के साथ काम करना आसान बनाते हैं; हालांकि, अकेले जावा के एसडीके का उपयोग:

if (removeTime(questionDate).equals(removeTime(today)) 
    ... 

public Date removeTime(Date date) {  
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    return cal.getTime(); 
} 
+0

साथ ही आप समय क्षेत्र के लिए समायोजित करने की आवश्यकता हो सकती है। –

+0

टाइमज़ोन अभी भी एक और कारण है जोडा समय =) –

+0

धन्यवाद एरिक। यह ठीक काम कर रहा है। मेरे पास इस पर एक सवाल है। समय निकालने के लिए विधि लिखने के बजाय, क्या हम डेटफॉर्मेट का उपयोग नहीं कर सकते? कृपया –

13

मैं इसके लिए जोडाटाइम का उपयोग करूंगा। यहां एक उदाहरण दिया गया है - मान लें कि आप 2 तिथियों के बीच के दिनों में अंतर खोजना चाहते हैं।

DateTime startDate = new DateTime(some_date); 
DateTime endDate = new DateTime(); //current date 
Days diff = Days.daysBetween(startDate, endDate); 
System.out.println(diff.getDays()); 

जोडाटाइम here से डाउनलोड किया जा सकता है।

+0

हाँ मुझे शुरुआत से 1 सप्ताह पहले प्राप्त करना होगा .. धन्यवाद –

9

यह मुझे स्पष्ट नहीं है कि आप क्या चाहते हैं, लेकिन मैं उल्लेख करूंगा कि Date कक्षा में compareTo विधि भी है, जिसका उपयोग दो कॉल ऑब्जेक्ट बराबर या यदि वे नहीं हैं तो एक कॉल के साथ निर्धारित करने के लिए उपयोग किया जा सकता है बराबर) जो जल्द ही होता है। यह आप की तरह कुछ करने के लिए अनुमति देता है:

switch (today.compareTo(questionDate)) { 
    case -1: System.out.println("today is sooner than questionDate"); break; 
    case 0: System.out.println("today and questionDate are equal"); break; 
    case 1: System.out.println("today is later than questionDate"); break; 
    default: System.out.println("Invalid results from date comparison"); break; 
} 

यह ध्यान देने योग्य है कि एपीआई डॉक्स गारंटी नहीं है परिणाम -1, 0, और 1 होने के लिए है, तो आप अगर-elses के बजाय का उपयोग कर सकते किसी भी उत्पादन कोड में एक स्विच। साथ ही, यदि दूसरी तारीख शून्य है, तो आपको एक NullPointerException मिलेगा, इसलिए एक कोशिश में अपना कोड लपेटना उपयोगी हो सकता है।

-1

यहाँ आप कहते हैं yyyy-mm-dd तुलना के लिए क्या कर सकते हैं: दो कैलेंडर चर साल के एक ही दिन है, तो

GregorianCalendar gc= new GregorianCalendar(); 
gc.setTimeInMillis(System.currentTimeMillis()); 
gc.roll(GregorianCalendar.DAY_OF_MONTH, true); 

Date d1 = new Date(); 
Date d2 = gc.getTime(); 

SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd"); 

if(sf.format(d2).hashCode() < sf.format(d1).hashCode()) 
{ 
    System.out.println("date 2 is less than date 1"); 
} 
else 
{ 
    System.out.println("date 2 is equal or greater than date 1"); 
} 
1

निम्नलिखित सच वापस आ जाएगी।

public boolean isSameDay(Calendar c1, Calendar c2){ 
    final int DAY=1000*60*60*24; 
    return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY)); 
    } // end isSameDay 
4

दो तिथियों की तुलना करने का सबसे आसान तरीका उन्हें संख्यात्मक मान (जैसे यूनिक्स टाइमस्टैम्प) में परिवर्तित कर रहा है।

आप Date.getTime() विधि का उपयोग कर सकते हैं जो यूनिक्स समय लौटाता है। आप टो उन्हें स्ट्रिंग के रूप में तुलना करने के लिए सक्षम होने के लिए एक ही fromat फिट करने के लिए तारीखें प्रारूप में तैयार करना :

Date questionDate = question.getStartDate(); 
Date today = new Date(); 
if((today.getTime() == questionDate.getTime())) { 
    System.out.println("Both are equals"); 
} 
+1

सच है, लेकिन यह अनिवार्य रूप से 'बराबर()' पहले से ही है। इसके अलावा मुझे नहीं लगता कि यह मूल प्रश्न का उत्तर देता है। लगता है जैसे वे * दिनांक * की तुलना करने की कोशिश कर रहे थे और किसी भी समय हिस्से को अनदेखा करते थे। '==' का उपयोग करना ऐसा नहीं करेगा। – Leigh

+0

आप सही हैं। मैं (एक और जवाब [कड़ी] (http://stackoverflow.com/questions/3144387/compare-two-dates-in-java/13870774#13870774) – Jamal

+0

एक और उत्तर पोस्ट करने के लिए, बस [यह एक अद्यतन] कोई ज़रूरत नहीं http पोस्ट : //stackoverflow.com/posts/13853528/edit)। – Leigh

0

यहाँ एक एक और जवाब है।

Date questionDate = question.getStartDate(); 
    Date today = new Date(); 

    SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd"); 

    String questionDateStr = dateFormatter.format(questionDate); 
    String todayStr = dateFormatter.format(today); 

    if(questionDateStr.equals(todayStr)) { 
     System.out.println("Both are equals"); 
    } 
+0

पोस्ट करने से पहले पिछले सुझावों को पढ़ना चाहते हैं [क्रोलिक ने पहले ही सुझाव दिया है कि 2010 में वापस] (http://stackoverflow.com/a/4196253/104223) ;-) व्यक्तिगत रूप से मैं [एरिक का सुझाव] पसंद करता हूं (http: // stackoverflow .com/एक/3144444/१,०४,२२३)। स्ट्रिंग्स और डेट लॉजिक आईएमओ मिश्रण नहीं करते हैं। – Leigh

3

यह ESY उपयोग कर रहा है time.compareTo(currentTime) < 0

import java.util.Calendar; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class MyTimerTask { 
    static Timer singleTask = new Timer(); 

    @SuppressWarnings("deprecation") 
    public static void main(String args[]) { 
     // set download schedule time 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 9); 
     calendar.set(Calendar.MINUTE, 54); 
     calendar.set(Calendar.SECOND, 0); 
     Date time = (Date) calendar.getTime(); 
     // get current time 
     Date currentTime = new Date(); 
     // if current time> time schedule set for next day 
     if (time.compareTo(currentTime) < 0) { 

      time.setDate(time.getDate() + 1); 
     } else { 
      // do nothing 
     } 
     singleTask.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println("timer task is runing"); 
      } 
     }, time); 

    } 

} 
0
public static double periodOfTimeInMillis(Date date1, Date date2) { 
    return (date2.getTime() - date1.getTime()); 
} 

public static double periodOfTimeInSec(Date date1, Date date2) { 
    return (date2.getTime() - date1.getTime())/1000; 
} 

public static double periodOfTimeInMin(Date date1, Date date2) { 
    return (date2.getTime() - date1.getTime())/(60 * 1000); 
} 

public static double periodOfTimeInHours(Date date1, Date date2) { 
    return (date2.getTime() - date1.getTime())/(60 * 60 * 1000); 
} 

public static double periodOfTimeInDays(Date date1, Date date2) { 
    return (date2.getTime() - date1.getTime())/(24 * 60 * 60 * 1000L); 
} 
0
public long compareDates(Date exp, Date today){ 

     long b = (exp.getTime()-86400000)/86400000; 
     long c = (today.getTime()-86400000)/86400000; 
     return b-c; 
    } 

यह GregorianDates. 86,400,000 लिए काम करता है एक दिन में मिलीसेकेंड की राशि कर रहे हैं, यह दो तिथियों के बीच दिनों की संख्या वापस आ जाएगी ।

0

यह मेरे काम को साझा करते हुए एक बहुत पुरानी पोस्ट है। यह एक छोटा सा चाल आपकी आवश्यकता

0
मेरे मामले में

के अनुसार तो

DateTime dtStart = new DateTime(Dateforcomparision); 
DateTime dtNow = new DateTime(); //current date 

if(dtStart.getMillis() <= dtNow.getMillis()) 
{ 
    //to do 
} 

उपयोग तुलनित्र करना है, मैं बस कुछ इस तरह करना था:

date1.toString().equals(date2.toString()) 

और यह काम किया!

2

java.time

जावा 8 में Joda-Time उपयोग करने के लिए के रूप में यह java.time पैकेज में एक ऐसी ही नई एपीआई के साथ आता है कोई जरूरत नहीं है। LocalDate कक्षा का उपयोग करें।

LocalDate date = LocalDate.of(2014, 3, 18); 
LocalDate today = LocalDate.now(); 

Boolean isToday = date.isEqual(today); 

आप Period वर्ग के साथ तारीखों के बीच की अवधि के लिए पूछ सकते हैं।

Period difference = Period.between(date, today); 

LocalDateequals और compareTo का उपयोग कर के रूप में यह समय और समय क्षेत्र के बारे में कोई जानकारी रखता तुलनीय है।


java.time

बारे java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacy दिनांक-समय कक्षाएं जैसे java.util.Date, Calendar, & SimpleDateFormat प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8, Java SE 9, और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और Java SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • java.time वर्गों के एंड्रॉयड बंडल कार्यान्वयन के बाद के संस्करण।
    • पहले एंड्रॉइड के लिए, ThreeTenABP प्रोजेक्ट थ्रीटेन-बैकपोर्ट (ऊपर उल्लिखित) का अनुकूलन करता है। How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more

+1

अच्छा जवाब है, लेकिन मैं हमेशा 'टाइम' विधि में वैकल्पिक समय क्षेत्र को पारित करने का सुझाव देता हूं। यदि छोड़ा गया है तो आप JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र पर पूर्ण रूप से निर्भर हैं। वह डिफ़ॉल्ट * किसी भी समय * आपके कोड (!) के निष्पादन के दौरान भी बदल सकता है। अपेक्षित/वांछित समय क्षेत्र निर्दिष्ट करने के लिए बेहतर है। 'LocalDate.now (ZoneId.of (" अमेरिका/मॉन्ट्रियल "))' –

0

यह सबसे अच्छा काम करता है ....

Calendar cal1 = Calendar.getInstance(); 
Calendar cal2 = Calendar.getInstance(); 

cal1.setTime(date1); 
cal2.setTime(date2); 

boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR); 
+0

FYI करें: 'Calendar' वर्ग परेशानी पुराने तिथि-समय वर्गों है कि अब विरासत हैं, java.time वर्गों द्वारा जगह ले ली का हिस्सा है। –