2010-05-11 18 views
28

Ich habe zwei Termine:Datum Vergleich mit Java

  1. toDate (Benutzereingabe in MM/dd/yyyy Format)
  2. currentDate (erhalten durch new Date())

ich die currentDate mit toDate vergleichen müssen. Ich muss einen Bericht nur anzeigen, wenn der toDate gleich oder größer als currentDate ist. Wie kann ich das machen?

+0

Ihre ursprüngliche Frage wurde ehrlich gesagt schrecklich gesagt. Ich habe es verbessert. Versuchen Sie in Zukunft, so klar wie möglich zu sein. Wiederhole die Dinge nicht 3-mal und/oder unnötige Fett-Dinge :) – BalusC

+3

Dies könnte helfen, wenn Sie die Verwendung von Joda Bibliothek http://StackOverflow.com/Questions/1439779/How-to-Compare-Two-Dates-without- the-time-portion – ukanth

+0

JodaTime bietet so viel mehr als Java's Date API ... http://joda-time.sourceforge.net/. Es würde dies und Ihre anderen Termine viel einfacher machen. – harschware

Antwort

6

Date#equals() und Date#after()

Wenn es eine Möglichkeit gibt, dass die hour und minute Felder sind! = 0, dann würden Sie sie auf 0

Ich kann nicht vergessen zu erwähnen, setzen müssen, dass die Verwendung java.util.Date wird als eine schlechte Methode angesehen und die meisten Methoden sind veraltet. Verwenden Sie nach Möglichkeit java.util.Calendar oder JodaTime.

+0

Da Date.equals() Millisekunden vergleicht und das aktuelle Datum mit der MM/TT/JJJJ-Benutzereingabe vergleicht, ist das kein wirklich produktiver Ansatz. – BlairHippo

+0

Er will vergleichen nicht Gleichheit prüfen. – tkr

+0

ja, danke, ich habe die 'nachher'-Methode hinzugefügt – Bozho

0

Verwenden Sie java.util.Calendar, wenn Sie umfangreiche datumsbezogene Verarbeitung haben.

Datum hat before(), after() Methoden. Sie könnten sie auch verwenden.

5

Sie suchen wahrscheinlich für:

!toDate.before(currentDate) 

vor() und nach() Test, ob das Datum genau vor oder nach. Man muss also die Negation des anderen nehmen, um ein nicht strenges Verhalten zu erhalten.

+0

Bitte korrigieren Sie mich, wenn ich falsch liege, aber scheitert das nicht, wenn der Benutzer das heutige Datum eingibt? "new Date()" setzt die Uhrzeit auf wann immer sie aufgerufen wird, und ein Date-Objekt basierend auf MM/TT/JJJJ ist effektiv 0:00 Uhr an diesem Morgen. Oder sind Date.before() und Date.after() nicht auf Millisekunden basiert der Weg Date.equals() ist? – BlairHippo

+0

Das stimmt. Eigentlich müssen Sie Kalender oder einen DateFormatter verwenden, um Zeit in java.util.Date loszuwerden. – tkr

17

Es ist einfacher, Daten mit der java.util.Calendar zu vergleichen. Hier ist, was man tun könnte:

Calendar toDate = Calendar.getInstance(); 
Calendar nowDate = Calendar.getInstance(); 
toDate.set(<set-year>,<set-month>,<set-day>); 
if(!toDate.before(nowDate)) { 
    //display your report 
} else { 
    // don't display the report 
} 
+0

Frage: Möchten Sie die Stunde/Minute/etc explizit löschen? Felder aus dem nowDate, oder macht die Tatsache, dass sie nicht inDate sind, keine Rolle? – BlairHippo

+1

+1 für die Verwendung von Kalender. Wenn Sie nicht in der Nähe der Millisekunden-Ebene vergleichen, möchten Sie den Kalender normalerweise sofort nach dem Erstellen löschen() und dann die set-Methode aufrufen. – Ophidian

+0

@Ophidian Danke für den clear() Hinweis –

11

Wenn Sie sich mit Java gesetzt sind Daten eher als, sagen wir, JodaTime, eine java.text.DateFormat verwenden, um die Zeichenfolge in ein Datum zu konvertieren, dann vergleichen Sie die beiden mit .equals:

Ich hätte fast vergessen: Sie müssen die Stunden, Minuten, Sekunden und Millisekunden am aktuellen Datum auf Null setzen, bevor Sie sie vergleichen. Ich habe unten ein Objekt Calendar verwendet, um es zu tun.

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

// Other code here 
    String toDate; 
    //toDate = "05/11/2010"; 

    // Value assigned to toDate somewhere in here 

    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); 
    Calendar currDtCal = Calendar.getInstance(); 

    // Zero out the hour, minute, second, and millisecond 
    currDtCal.set(Calendar.HOUR_OF_DAY, 0); 
    currDtCal.set(Calendar.MINUTE, 0); 
    currDtCal.set(Calendar.SECOND, 0); 
    currDtCal.set(Calendar.MILLISECOND, 0); 

    Date currDt = currDtCal.getTime(); 

    Date toDt; 
    try { 
     toDt = df.parse(toDate); 
    } catch (ParseException e) { 
     toDt = null; 
     // Print some error message back to the user 
    } 

    if (currDt.equals(toDt)) { 
     // They're the same date 
    } 
+0

Einige Bugs in diesem ... behoben, vergaß die 'ParseException' in der Originalversion zu fangen. – Powerlord

4

Dies ist eine der Möglichkeiten:

String toDate = "05/11/2010"; 

if (new SimpleDateFormat("MM/dd/yyyy").parse(toDate).getTime()/(1000 * 60 * 60 * 24) >= System.currentTimeMillis()/(1000 * 60 * 60 * 24)) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 

Ein bisschen leichter interpretierbar:

String toDateAsString = "05/11/2010"; 
Date toDate = new SimpleDateFormat("MM/dd/yyyy").parse(toDateAsString); 
long toDateAsTimestamp = toDate.getTime(); 
long currentTimestamp = System.currentTimeMillis(); 
long getRidOfTime = 1000 * 60 * 60 * 24; 
long toDateAsTimestampWithoutTime = toDateAsTimestamp/getRidOfTime; 
long currentTimestampWithoutTime = currentTimestamp/getRidOfTime; 

if (toDateAsTimestampWithoutTime >= currentTimestampWithoutTime) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 

Oh, als Bonus, die JodaTime ‚s Variante:

String toDateAsString = "05/11/2010"; 
DateTime toDate = DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(toDateAsString); 
DateTime now = new DateTime(); 

if (!toDate.toLocalDate().isBefore(now.toLocalDate())) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 
+0

Das erste Beispiel funktionierte perfekt für meine Bedürfnisse :) – atwright147

1

Wenn Sie aus irgendeinem Grund sind Absicht auf Date Objekte für Ihre Lösung verwenden, müssen Sie so etwas wie dies tun:


    // Convert user input into year, month, and day integers 
    Date toDate = new Date(year - 1900, month - 1, day + 1); 
    Date currentDate = new Date(); 
    boolean runThatReport = toDate.after(currentDate); 

Verschiebung des toDate vor bis Mitternacht des nächsten Tages Pflege in den Kommentaren Ich habe über nehmen die Wanze jammerte zu anderen Antworten. Beachten Sie jedoch, dass bei diesem Ansatz ein veralteter Konstruktor verwendet wird. Jeder Ansatz, der sich auf Date stützt, verwendet eine veraltete Methode oder eine andere, und abhängig davon, wie Sie dies tun, kann es auch zu Rennbedingungen führen (wenn Sie von new Date() basieren und dann mit Jahr, Monat und Tag herumspielen)). Verwenden Sie Calendar, wie an anderer Stelle beschrieben.

3

Datum long getTime() gibt die Anzahl der Millisekunden seit January 1, 1970, 00:00:00 GMT zurück, die von diesem Date-Objekt dargestellt werden.

//test if date1 is before date2 
if(date1.getTime() < date2.getTime()) { 
.... 
} 
2

Private boolean checkDateLimit() {

long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1 
    long Date1InMilisecond = Date1.getTimeInMillis(); //Date2 

    if (CurrentDateInMilisecond <= Date1InMilisecond) { 
     return true; 
    } else { 
     return false; 
    } 

} 

// Konvertieren sowohl Datum in milisecond Wert.