Ich habe zwei Termine:
toDate
(Benutzereingabe im MM/dd/yyyy
-Format)currentDate
(erhalten von new Date()
) Ich muss currentDate
mit toDate
vergleichen. Ich muss einen Bericht nur anzeigen, wenn toDate
gleich oder größer als currentDate
ist. Wie kann ich das machen?
Es ist einfacher, Datumsangaben mit dem Java.util.Calendar
..__ zu vergleichen.
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
}
Wenn Sie Java-Daten anstelle von JodaTime verwenden möchten, verwenden Sie einen Java.text.DateFormat
, um die Zeichenfolge in ein Datum zu konvertieren. Vergleichen Sie die beiden mit .equals:
Ich habe fast vergessen: Sie müssen die Stunden, Minuten, Sekunden und Millisekunden am aktuellen Datum auf Null setzen, bevor Sie sie vergleichen. Ich habe dazu ein Calendar
object benutzt.
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
}
Date#equals()
und Date#after()
Wenn die Möglichkeit besteht, dass die Felder hour
und minute
! = 0 sind, müssen Sie sie auf 0 setzen.
Ich kann nicht vergessen zu erwähnen, dass die Verwendung von Java.util.Date
eine schlechte Praxis ist und die meisten Methoden veraltet sind. Verwenden Sie, falls möglich, Java.util.Calendar
oder JodaTime .
Sie suchen wahrscheinlich:
!toDate.before(currentDate)
vor () und nach () testen, ob das Datum strikt vor oder nach dem Datum liegt. Sie müssen also die Negation des anderen nehmen, um nicht strenges Verhalten zu erhalten.
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.");
}
Etwas einfacher 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.");
}
Date long getTime()
gibt die Anzahl der Millisekunden seit January 1, 1970, 00:00:00 GMT
zurück, die durch dieses Date-Objekt dargestellt wird.
//test if date1 is before date2
if(date1.getTime() < date2.getTime()) {
....
}
private boolean checkDateLimit () {
long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1
long Date1InMilisecond = Date1.getTimeInMillis(); //Date2
if (CurrentDateInMilisecond <= Date1InMilisecond) {
return true;
} else {
return false;
}
}
// Konvertiere beide Datumsangaben in Millisekunden.
Wenn Sie aus irgendeinem Grund Date
-Objekte für Ihre Lösung verwenden möchten, müssen Sie Folgendes 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);
Wenn Sie die Variable toDate
auf Mitternacht des nächsten Tages verschieben, wird der Fehler behoben, über den ich in den Kommentaren zu anderen Antworten geheult habe. Beachten Sie jedoch, dass dieser Ansatz einen veralteten Konstruktor verwendet. Jeder Ansatz, der sich auf Date
stützt, verwendet eine veraltete Methode oder eine andere, und je nachdem, wie Sie vorgehen, kann dies ebenfalls zu Rennbedingungen führen (wenn Sie toDate
von new Date()
abhängen und dann beispielsweise mit Jahr, Monat und Tag herumspielen ). Verwenden Sie Calendar
wie an anderer Stelle beschrieben.
Verwenden Sie Java.util.Calendar
, wenn Sie eine umfangreiche datumsbezogene Verarbeitung haben.
Datum hat before()
, after()
Methoden. Sie könnten sie auch verwenden.