Wie vergleicht man Daten in Java?

Wie vergleiche ich Datumsangaben in Java miteinander?

Beispiel:

Datum1 ist 22-02-2010
datum2 ist 07-04-2010 heute
datum3 ist 25-12-2010

Datum3 ist immer größer als Datum1 und Datum2 ist immer heute. Wie überprüfe ich, ob das Datum von heute&#39 zwischen Datum1 und Datum 3 liegt?

Lösung

[Datum][1] hat [vor][2] und [nach][3] Methoden und kann [miteinander][4] wie folgt verglichen werden:

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

Für einen umfassenden Vergleich:


if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
    /* historyDate 
Kommentare (5)

Im Folgenden sind die gebräuchlichsten Methoden zum Vergleich von Daten aufgeführt. Aber ich habe die erste bevorzugt

Ansatz-1 : Verwendung von Date.before(), Date.after() und 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 : Datum.vergleichenZu()


           if(date1.compareTo(date2)>0){
                System.out.println("Date1 is after Date2");
            }else if(date1.compareTo(date2)
Kommentare (1)

~ 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, wenn Sie die Drei-Zehn-Extra-Bibliothek zu Ihrem Projekt hinzufügen.

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

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

Schlechte Wahl des Formats

Das ist übrigens eine schlechte Wahl des Formats für eine Textdarstellung eines Datums- oder Datum-Uhrzeit-Wertes. Halten Sie sich, wann immer möglich, an die Standardformate [ISO 8601][1]. Die ISO 8601-Formate sind eindeutig, in allen menschlichen Kulturen verständlich und maschinell leicht zu analysieren. Für einen reinen Datumswert lautet das Standardformat JJJJJ-MM-TT. Beachten Sie, dass dieses Format den Vorteil hat, bei alphabetischer Sortierung chronologisch zu sein.

LocalDate

Die Klasse LocalDate stellt einen reinen Datumswert ohne Tageszeit und ohne Zeitzone dar. Eine Zeitzone ist für die Bestimmung eines Datums von entscheidender Bedeutung. Zu jedem beliebigen Zeitpunkt variiert das Datum auf dem Globus je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während er in Montréal Québec noch "gestern" ist.

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

DateTimeFormatter

Da Ihre Eingabezeichenfolgen kein Standardformat haben, müssen wir ein entsprechendes Formatierungsmuster definieren.

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

Verwenden Sie dies, um die Eingabezeichenfolgen zu analysieren.

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

In der Datumszeitarbeit ist es normalerweise am besten, eine Zeitspanne durch den Half-Open-Ansatz zu definieren, bei dem der Anfang inklusiv ist, während das Ende exklusiv ist. Wir wollen also wissen, ob heute derselbe Tag ist oder später als der Start und auch vor dem Stopp. Ein kürzerer Weg zu sagen "ist gleich oder später als der Start" ist "nicht vor dem Start".

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

Siehe [the Answer by gstackoverflow] (https://stackoverflow.com/a/33693122/642706) mit der Liste der Vergleichsmethoden, die Sie aufrufen können.

Über java.time

Das java.time Framework ist in Java 8 und höher eingebaut. Diese Klassen ersetzen die lästigen alten legacy Datum-Uhrzeit-Klassen wie java.util.Date, Calendar, & EinfachesDatumsformat. Das Joda-Time-Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration auf die java.time-Klassen. Weitere Informationen finden Sie im Oracle Tutorial. Und suchen Sie Stack Overflow für viele Beispiele und Erklärungen. Die Spezifikation lautet JSR 310. Wo erhält man die java.time Klassen?

  • Java SE 8 und 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 und SE 7
  • Ein Großteil der Funktionalität von java.time ist auf Java 6 &amp zurückportiert; 7 in Drei-Drei-Zehn-Backport zurückportiert.
  • Android
  • Das Projekt ThreeTenABP passt ThreeTen-Backport (oben erwähnt) speziell für Android an.
  • Siehe So verwenden Sie ThreeTenABP.... Das ThreeTen-Extra Projekt erweitert java.time mit zusätzlichen Klassen. Dieses Projekt ist ein Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie können hier einige nützliche Klassen finden, wie z.B. Interval, YearWeek, YearQuarter und more.

    AKTUALISIEREN: Dieser "Joda-Time"-Abschnitt unten ist als Geschichte intakt geblieben. Das Joda-Time-Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration zu den java.time-Klassen. Joda-Zeit

    Andere Antworten sind korrekt in Bezug auf die gebündelten Klassen java.util.Date und java.util.Calendar. Aber diese Klassen sind notorisch lästig. Daher hier's etwas Beispielcode unter Verwendung der Bibliothek [Joda-Time][2] 2.3.

Wenn Sie wirklich ein Datum ohne Zeitanteil und ohne Zeitzone wünschen, dann verwenden Sie die Klasse [LocalDate][3] in Joda-Time. Diese Klasse stellt Vergleichsmethoden zur Verfügung, einschließlich compareTo (verwendet mit [Java Comparators][4]), isBefore, isAfter und isEqual. Eingaben...

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

Definieren Sie einen Formatierer, der die Eingabestrings beschreibt...

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

Verwenden Sie Formatierer, um die Zeichenfolgen 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 auf die Konsole...

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

Wenn ausgeführt...

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, die Klassen in Joda-Time zu erforschen: [Dauer][5], [Intervall][6] und [Periode][7]. Methoden wie "Überlappung" und "Enthält" machen Vergleiche leicht. Für Textdarstellungen sehen Sie sich die ISO 8601-Normen an:

Kommentare (0)

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 Greater than my date"); 
  else
      System.out.println("Both Dates are equal"); 
Kommentare (3)

Update für Java 8 und höher

Diese Methoden existieren in den Klassen [LocalDate][1], [LocalTime][2] und [LocalDateTime][3].

Diese Klassen sind in Java 8 und höher eingebaut. Ein Großteil der Funktionalität von java.time wird nach Java 6 &amp zurückportiert; 7 in ThreeTen-Backport zurückportiert und weiter an Android in ThreeTenABP angepasst (siehe How to use...).

[1]: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html [2]: https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html [3]: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

Kommentare (3)

Sie können [Date.getTime()][1] verwenden:

die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT, zurückgibt

repräsentiert durch dieses Datumsobjekt.

Das bedeutet, dass Sie sie wie Zahlen vergleichen können:


if (date1.getTime() 
Kommentare (0)

Verwenden Sie getTime(), um den numerischen Wert des Datums zu erhalten, und vergleichen Sie dann mit den zurückgegebenen Werten.

Kommentare (0)

Versuchen Sie dies

public static boolean compareDates(String psDate1, String psDate2) throws ParseException{
        SimpleDateFormat dateFormat = new SimpleDateFormat ("dd/MM/yyyy");
        Date date1 = dateFormat.parse(psDate1);
        Date date2 = dateFormat.parse(psDate2);
        if(date2.after(date1)) {
            return true;
        } else {
            return false;
        }
    }
Kommentare (0)

Diese Methode hat bei mir funktioniert:

 public static String daysBetween(String day1, String day2) {
    String daysBetween = "";
    SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {
        Date date1 = myFormat.parse(day1);
        Date date2 = myFormat.parse(day2);
        long diff = date2.getTime() - date1.getTime();
        daysBetween = ""+(TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return daysBetween;
}
Kommentare (1)

Dieser Code bestimmt heute ist in einiger Dauer. basierend auf KOREA-Gebietsschema

    Calendar cstart = Calendar.getInstance(Locale.KOREA);
    cstart.clear();
    cstart.set(startyear, startmonth, startday);

    Calendar cend = Calendar.getInstance(Locale.KOREA);
    cend.clear();
    cend.set(endyear, endmonth, endday);

    Calendar c = Calendar.getInstance(Locale.KOREA);

    if(c.after(cstart) && c.before(cend)) {
        // today is in startyear/startmonth/startday ~ endyear/endmonth/endday
    }
Kommentare (0)