25 Stimmen

Zwei Daten in Java vergleichen

Ich muss zwei Daten in Java vergleichen. Ich verwende den Code wie folgt:

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

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

Das funktioniert nicht. Der Inhalt der Variablen ist der folgende:

  • questionDate enthält 2010-06-30 00:31:40.0
  • today enthält Wed Jun 30 01:41:25 IST 2010

Wie kann ich das Problem lösen?

42voto

Eric Hauser Punkte 5531

Die Gleichheit des Datums hängt davon ab, dass die beiden Daten auf die Millisekunde genau gleich sind. Erstellen eines neuen Datumsobjekts mit new Date() wird niemals einem in der Vergangenheit erstellten Datum entsprechen. Joda Zeit Die APIs von Java vereinfachen die Arbeit mit Datumsangaben; die Verwendung des Java-SDK allein reicht jedoch nicht aus:

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 Stimmen

Möglicherweise müssen Sie auch die Zeitzone berücksichtigen.

0 Stimmen

Zeitzonen sind ein weiterer Grund, Joda Time zu nutzen =)

0 Stimmen

Danke Eric, es funktioniert einwandfrei. Ich habe eine Frage zu diesem Thema. Anstatt Methode zu schreiben, um die Zeit zu entfernen, können wir nicht das Dateformat verwenden? bitte klären

13voto

CoolBeans Punkte 20350

Ich würde dafür JodaTime verwenden. Hier ist ein Beispiel - sagen wir, Sie wollen die Differenz in Tagen zwischen 2 Daten finden.

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

JodaTime kann heruntergeladen werden von aquí .

10voto

GreenMatt Punkte 17578

Es ist mir nicht klar, was Sie wollen, aber ich werde erwähnen, dass die Datum Klasse hat auch eine compareTo Methode, mit der mit einem Aufruf festgestellt werden kann, ob zwei Datumsobjekte gleich sind oder (falls sie nicht gleich sind) welches früher eintritt. Dies ermöglicht Ihnen, etwas zu tun wie:

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;
}

Es sollte beachtet werden, dass die API-Dokumente nicht garantieren, dass die Ergebnisse -1, 0 und 1 sind, so dass Sie möglicherweise if-elses statt eines Schalters in jedem Produktionscode verwenden möchten. Wenn das zweite Datum null ist, erhalten Sie außerdem eine NullPointerException, so dass es sinnvoll sein kann, Ihren Code in ein try-catch zu verpacken.

5voto

Jamal Punkte 69

Der einfachste Weg, zwei Daten zu vergleichen, ist die Umwandlung in einen numerischen Wert (wie ein Unix-Zeitstempel).

Sie können verwenden Date.getTime() Methode, die die Unix-Zeit zurückgibt.

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

1 Stimmen

Stimmt, aber das ist im Wesentlichen das, was equals() bereits tut. Ich glaube auch nicht, dass dies eine Antwort auf die ursprüngliche Frage ist. Es klingt so, als ob sie versuchen würden, die Datum und ignorieren jeden Zeitanteil. verwenden == wird das nicht tun.

0 Stimmen

Sie haben Recht. Ich poste eine andere Antwort lien

0 Stimmen

Es ist nicht nötig, eine weitere Antwort zu posten, nur diese aktualisieren .

5voto

recke96 Punkte 159

Java.time

In Java 8 besteht keine Notwendigkeit, die Joda-Time da es mit einer ähnlichen neuen API in der java.time Paket. Verwenden Sie die LocalDate Klasse.

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

Boolean isToday = date.isEqual( today );

Sie können nach der Zeitspanne zwischen den Daten fragen mit Period Klasse.

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

LocalDate ist vergleichbar mit equals y compareTo da sie keine Informationen über Zeit und Zeitzone enthält.


Über java.time

El java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date , Calendar , & SimpleDateFormat .

El Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

Weitere Informationen finden Sie in der Oracle-Tutorial . Und suchen Sie auf Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 310 .

Wo erhält man die java.time-Klassen?

  • Java SE 8 , Java SE 9 und später
    • Eingebaut.
    • Teil der Standard-Java-API mit einer gebündelten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 y Java SE 7
    • Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert in DreiZehn-Backport .
  • Android
    • Spätere Versionen von Android bündeln Implementierungen der java.time-Klassen.
    • Bei früheren Android-Versionen ist die DreiZehnABP Projekt passt sich an DreiZehn-Backport (siehe oben). Siehe Wie benutzt man ThreeTenABP .

El DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie finden hier vielleicht einige nützliche Klassen wie Interval , YearWeek , YearQuarter y mehr .

1 Stimmen

Gute Antwort, aber ich schlage vor, dass Sie die optionale Zeitzone immer an die now Methode. Wenn sie weggelassen wird, sind Sie implizit von der aktuellen Standardzeitzone der JVM abhängig. Diese Vorgabe kann sich ändern in jedem Augenblick sogar während der Ausführung Ihres Codes(!). Besser ist es, die erwartete/gewünschte Zeitzone anzugeben. LocalDate.now( ZoneId.of( "America/Montreal" ) )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X