it-swarm.com.de

Wie vergleicht man Daten in Java?

Wie vergleiche ich Daten zwischen in Java?

Beispiel:

date1 ist 22-02-2010
date2 ist heute 07-04-2010
date3 ist 25-12-2010

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

363
ant

Date hat before und after Methoden und kann miteinander verglichen wie folgt sein:

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

Für einen inklusiven Vergleich:

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

Sie können auch Joda-Time probieren, beachten Sie jedoch Folgendes:

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

Back-Ports sind für Java 6 und 7 sowie für Android verfügbar.

561
Bart Kiers

Verwenden Sie compareTo :

date1.compareTo(date2);

125
Chandra Sekar

Im Folgenden finden Sie die gebräuchlichste Methode zum Vergleichen von Daten. Aber ich habe lieber die erste

Ansatz-1: Verwenden 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: 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: Kalender.vor (), Kalender.nach () und Kalender.gleich ()

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");
            }
91

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 Ihrem Projekt die Bibliothek ThreeTen-Extra hinzufügen.

_LocalDateRange.of(
    LocalDate.of( … ) ,
    LocalDate.of( … )
).contains(
    LocalDate.now()
)
_

Halboffener Ansatz, bei dem der Anfang einschließlich und das Ende ausschließlich ist.

Schlechte Wahl des Formats

Das ist übrigens eine schlechte Wahl des Formats für eine Textdarstellung eines Datums oder eines Datum-Zeit-Werts. Halten Sie sich nach Möglichkeit an die Standardformate ISO 8601 . ISO 8601-Formate sind eindeutig, kulturübergreifend verständlich und lassen sich maschinell leicht analysieren.

Für einen Wert nur für das Datum lautet das Standardformat JJJJ-MM-TT. Beachten Sie, dass dieses Format den Vorteil hat, chronologisch zu sein, wenn es alphabetisch sortiert wird.

LocalDate

Die Klasse LocalDate repräsentiert einen Datumswert ohne Uhrzeit und ohne Zeitzone.

Eine Zeitzone ist für die Bestimmung eines Datums von entscheidender Bedeutung. Für jeden Moment variiert das Datum rund um den Globus je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während noch „gestern“ in Montréal Québec .

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

DateTimeFormatter

Da Ihre Eingabezeichenfolgen nicht dem Standardformat entsprechen, müssen wir ein Formatierungsmuster definieren, das übereinstimmt.

_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 Datums-/Zeitarbeit ist es normalerweise am besten, eine Zeitspanne durch den Half-Open-Ansatz zu definieren, bei dem der Anfang einschließlich und das Ende ausschließlich . Wir wollen also wissen, ob das heutige Datum gleich oder später ist als der Start und auch vor dem Stopp. 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 ) ;
_

Siehe die Antwort von gstackoverflow mit der Liste der Vergleichsmethoden, die Sie aufrufen können.


Über Java.time

Das Java.time Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die lästigen alten Legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat =.

Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration in die Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 31 .

Woher bekomme ich die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und more .


UPDATE: Dieser Abschnitt „Joda-Time“ bleibt als Verlauf erhalten. Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration in die Java.time -Klassen.

Joda-Zeit

Andere Antworten sind in Bezug auf die gebündelten Klassen Java.util.Date und Java.util.Calendar korrekt. Aber diese Klassen sind notorisch mühsam. Hier ist ein Beispielcode mit der Joda-Time 2.3-Bibliothek.

Wenn Sie wirklich ein Datum ohne Zeitangabe und ohne Zeitzone wünschen, verwenden Sie die Klasse LocalDate in Joda-Time. Diese Klasse bietet Vergleichsmethoden, einschließlich compareTo (verwendet mit Java Comparators ), 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 Zeichenfolgen in LocalDate-Objekte zu analysieren.

_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 to console ...

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

Beim Laufen ...

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

Sehen Sie also nach, ob die zweite zwischen den beiden anderen liegt (ausschließlich, was bedeutet, dass keiner der beiden Endpunkte gleich ist).

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

Arbeiten mit Zeitspannen

Wenn Sie mit Zeitspannen arbeiten, empfehle ich, die folgenden Klassen in Joda-Time zu untersuchen: Duration , Interval und Period . Methoden wie overlap und contains erleichtern den Vergleich.

Informationen zu Textdarstellungen finden Sie in den ISO 8601-Standards:

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

Joda-Time-Klassen können mit Zeichenfolgen in beiden Formaten arbeiten, sowohl als Eingabe (Parsen) als auch als Ausgabe (Generieren von Zeichenfolgen).

Joda-Time führt Vergleiche mit dem halboffenen Ansatz durch, wobei der Beginn der Spanne einschließlich ist Das Ende ist exklusiv . Dieser Ansatz ist für den Umgang mit Zeiträumen sinnvoll. Suchen Sie in StackOverflow nach weiteren Informationen.

28
Basil Bourque

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"); 
20
sam

Update für Java 8 und höher

Diese Methoden gibt es in den Klassen LocalDate , LocalTime und LocalDateTime .

Diese Klassen sind in Java 8 und höher integriert. Ein Großteil der Java.time-Funktionalität wird in ThreeTen-Backport auf Java 6 & 7 zurückportiert und an Android weiter angepasst in ThreeTenABP (siehe Verwendung… ).

14
gstackoverflow

Sie können Date.getTime() verwenden, das:

Gibt die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT zurück, die von diesem Date-Objekt dargestellt werden.

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

if (date1.getTime() <= date.getTime() && date.getTime() <= date2.getTime()) {
    /*
     * date is between date1 and date2 (both inclusive)
     */
}

/*
 * when date1 = 2015-01-01 and date2 = 2015-01-10 then
 * returns true for:
 * 2015-01-01
 * 2015-01-01 00:00:01
 * 2015-01-02
 * 2015-01-10
 * returns false for:
 * 2014-12-31 23:59:59
 * 2015-01-10 00:00:01
 * 
 * if one or both dates are exclusive then change <= to <
 */
11
Salman A

Versuche 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;
        }
    }
4
Garambe

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

4
Everyone

Dieser Code, der heute ermittelt wird, hat eine gewisse Dauer. Er basiert auf dem Gebietsschema von KOREA

    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
    }
0
Brownsoo Han

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;
}
0
Iman Marashi