447 Stimmen

Wie vergleicht man Daten in Java?

Wie vergleicht man in Java dazwischenliegende Daten?

Exemple :

Datum1 ist 22-02-2010
Datum2 ist 07-04-2010 heute
Datum3 ist 25-12-2010

date3 ist immer größer als date1 y date2 ist immer heute. Wie kann ich überprüfen, ob das heutige Datum zwischen Datum 1 und Datum 3 liegt?

686voto

Bart Kiers Punkte 160101

Datum hat vor y nach Methoden und können im Vergleich zueinander wie folgt:

if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
    // In between
}

Für einen umfassenden Vergleich:

if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
    /* historyDate <= todayDate <= futureDate */ 
}

Sie könnten auch Folgendes geben ジョダイム einen Versuch, aber beachten Sie das:

Joda-Time ist die de facto Standard-Datums- und Zeitbibliothek für Java vor Java SE 8. Die Benutzer werden nun aufgefordert, auf java.time ( JSR-310 ).

Backports sind für Java 6 und 7 sowie für Android verfügbar.

147voto

Chandra Sekar Punkte 10483

Verwenden Sie compareTo :

date1.compareTo(date2);

131voto

Sunil Kumar Sahoo Punkte 51391

Im Folgenden werden die gängigsten Vergleichsmöglichkeiten aufgeführt dates (meine Präferenz ist Ansatz 1 ) :

Ansatz 1: Verwendung Date.before() , Date.after() y Date.equals( )

if (date1.after(date2)) {
    System.out.println("Date1 is after Date2");
}

if (date1.before(date2)) {
    System.out.println("Date1 is before Date2");
}

if (date1.equals(date2)) {
    System.out.println("Date1 is equal Date2");
}

Ansatz 2: Date.compareTo()

if (date1.compareTo(date2) > 0) {
    System.out.println("Date1 is after Date2");
} else if (date1.compareTo(date2) < 0) {
    System.out.println("Date1 is before Date2");
} else {
    System.out.println("Date1 is equal to Date2");
}

Ansatz 3: Calender.before() , Calender.after( ) und Calender.equals()

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);

if (cal1.after(cal2)) {
    System.out.println("Date1 is after Date2");
}

if (cal1.before(cal2)) {
    System.out.println("Date1 is before Date2");
}

if (cal1.equals(cal2)) {
    System.out.println("Date1 is equal Date2");
}

43voto

Basil Bourque Punkte 256611

Tl;dr

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean isBetween = 
    ( ! today.isBefore( localDate1 ) )  // “not-before” is short for “is-equal-to or later-than”.
    &&
    today.isBefore( localDate3 ) ; 

Oder, besser noch, wenn Sie die DreiZehn-Extra Bibliothek zu Ihrem Projekt hinzufügen.

LocalDateRange.of(
    LocalDate.of( … ) ,
    LocalDate.of( … )
).contains(
    LocalDate.now()
)

Halboffener Ansatz, bei dem der Anfang inklusive während das Ende exklusiv .

Schlechte Wahl des Formats

Das ist übrigens ein schlechtes Format für die Textdarstellung eines Datums oder einer Zeitangabe. Wann immer möglich, halten Sie sich an den Standard ISO 8601 Formate. ISO 8601-Formate sind eindeutig, kulturübergreifend verständlich und maschinell leicht zu analysieren.

Für einen reinen Datumswert ist das Standardformat JJJJ-MM-TT. Beachten Sie, dass dieses Format den Vorteil hat, dass es chronologisch ist, wenn es alphabetisch sortiert wird.

LocalDate

En LocalDate stellt einen reinen Datumswert ohne Uhrzeit und ohne Zeitzone dar.

Die Zeitzone ist für die Bestimmung eines Datums entscheidend. Zu jedem beliebigen Zeitpunkt variiert das Datum je nach Zone rund um den Globus. Zum Beispiel, ein paar Minuten nach Mitternacht in Paris Frankreich ist ein neuer Tag und dennoch "gestern" in Montréal Québec .

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

Table of all date-time types in Java, both modern and legacy

DateTimeFormatter

Da es sich bei Ihren Eingabestrings um ein Nicht-Standardformat handelt, müssen wir ein Formatierungsmuster für die Übereinstimmung definieren.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );

Verwenden Sie dies, um die Eingabestrings zu parsen.

LocalDate start = LocalDate.parse( "22-02-2010" , f );
LocalDate stop = LocalDate.parse( "25-12-2010" , f );

Bei der Arbeit mit Datums- und Zeitangaben ist es in der Regel am besten, eine Zeitspanne nach dem halboffenen Ansatz zu definieren, bei dem der Beginn inklusive und das Ende ist exklusiv . Wir wollen also wissen, ob der heutige Tag gleich oder später als der Start und auch vor dem Stopp liegt. Eine kürzere Art zu sagen "ist gleich oder später als der Start" ist "nicht vor dem Start".

Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;

Véase die Antwort von gstackoverflow mit der Liste der Vergleichsmethoden, die Sie aufrufen können.


Über java.time

En 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 .

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

En ジョダイム Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

Sie können umtauschen java.time Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber übereinstimmend mit JDBC 4.2 oder später. Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.* Klassen. Unterstützung von Hibernate 5 und JPA 2.2 java.time .

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

En 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 und mehr .


UPDATE: Dieser "Joda-Time"-Abschnitt unten wird als Geschichte beibehalten. Die ジョダイム Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

ジョダイム

Andere Antworten sind richtig in Bezug auf die gebündelten Klassen java.util.Date und java.util.Calendar. Aber diese Klassen sind notorisch problematisch. Hier ist also ein Beispielcode, der die ジョダイム 2.3 Bibliothek.

Wenn Sie wirklich ein Datum ohne Zeitanteil und ohne Zeitzone wollen, dann verwenden Sie die LocalDate Klasse in Joda-Time. Diese Klasse bietet Vergleichsmethoden wie compareTo (verwendet mit Java-Vergleicher ), isBefore , isAfter und isEqual .

Eingänge

String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";

Definieren Sie einen Formatierer, der die Eingabezeichenfolgen beschreibt

DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );

Verwenden Sie den Formatierer, um die Strings in LocalDate-Objekte zu parsen

LocalDate localDate1 = formatter.parseLocalDate( string1 );
LocalDate localDate2 = formatter.parseLocalDate( string2 );
LocalDate localDate3 = formatter.parseLocalDate( string3 );

boolean is1After2 = localDate1.isAfter( localDate2 );
boolean is2Before3 = localDate2.isBefore( localDate3 );

Dump zur Konsole

System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );

Wenn es läuft

Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true

Schauen Sie also, ob der zweite zwischen den beiden anderen liegt (ausschließlich, d.h. nicht gleich einem der beiden Endpunkte)

boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );

Arbeiten mit Zeitspannen

Wenn Sie mit Zeitspannen arbeiten, schlage ich vor, in Joda-Time die Klassen zu erkunden: Dauer , Intervall und Zeitraum . Methoden wie overlap y contains machen Vergleiche einfach.

Für die Darstellung von Text können Sie sich an der ISO-Norm 8601 orientieren:

  • Dauer
    Format: PnYnMnDTnHnMnS
    Beispiel: P3Y6M4DT12H30M5S
    (Bedeutet "drei Jahre, sechs Monate, vier Tage, zwölf Stunden, dreißig Minuten und fünf Sekunden")
  • Intervall
    Format: Anfang/Ende
    Example: 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z

Joda-Time-Klassen können mit Strings in diesen beiden Formaten arbeiten, sowohl als Eingabe (Parsing) als auch als Ausgabe (Generierung von Strings).

Joda-Time führt Vergleiche unter Verwendung der Halboffen Ansatz, bei dem der Beginn der Spannweite inklusive und das Ende ist exklusiv . Dieser Ansatz ist ein kluger Ansatz für die Handhabung von Zeitspannen. Weitere Informationen finden Sie auf StackOverflow.

23voto

sam Punkte 376

Vergleichen Sie die beiden Daten:

  Date today = new Date();                   
  Date myDate = new Date(today.getYear(),today.getMonth()-1,today.getDay());
  System.out.println("My Date is"+myDate);    
  System.out.println("Today Date is"+today);
  if (today.compareTo(myDate)<0)
      System.out.println("Today Date is Lesser than my Date");
  else if (today.compareTo(myDate)>0)
      System.out.println("Today Date is Greater than my date"); 
  else
      System.out.println("Both Dates are equal");

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