Cum pentru a compara datele în Java?

Cum am compara datele intre în Java?

Exemplu:

data 1 este 22-02-2010
data2 este 07-04-2010 azi <br /> date3 este25-12-2010`

date3 este întotdeauna mai mare decât data 1 " și " data2` este mereu astăzi. Cum pot verifica dacă astăzi's date este în între data 1 și 3 data?

Soluția

[Data][1] a [înainte][2] și [după][3] metode și poate fi [comparativ cu fiecare alte][4] după cum urmează:

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

Pentru o inclusive comparație:


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

Folosi compareTo:

date1.compareTo(data2);

Comentarii (4)

Următoarele sunt cel mai comun mod de a compara datele. Dar am prefera prima

Abordare-1 : Folosind Data.înainte de a(), Data.după() și Data.este egal cu()

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

Abordare-2 : Data.compareTo()


           if(date1.compareTo(date2)>0){
                System.out.println("Date1 is after Date2");
            }else if(date1.compareTo(date2)
Comentarii (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 ) ; 

Sau, mai bine, dacă adăugați ThreeTen-Extra biblioteca dvs. de proiect.

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

Jumătate-o abordare deschisă, în cazul în care începutul este inclusive în timp ce se încheie este exclusiv.

Alegere proastă de Format

Apropo, asta e o alegere proasta a format o reprezentare a textului de o data sau data-valoarea în timp. Ori de câte ori este posibil, rămânem cu standardul ISO 8601 formate. ISO 8601 formate sunt clare, ușor de înțeles în culturile umane, și sunt ușor de a analiza de mașină. Pentru o dată-doar o valoare, formatul standard este AAAA-LL-ZZ. Notă modul în care acest format are avantajul de a fi cronologică când sortate în ordine alfabetică.

LocalDate

A LocalDate clasa reprezinta o dată-numai valoarea fara timp-de-zi și fără de fus orar. Un fus orar este esențială în a stabili o întâlnire. Pentru un moment dat, la data variază în jurul valorii de lume prin zona. De exemplu, la câteva minute după miezul nopții, în Paris, Franța este o nouă zi în timp ce încă mai "ieri" în Emiléal Québec.

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

DateTimeFormatter

Ca dvs. de intrare siruri de caractere sunt non-standard format, trebuie să definim un model de formatare pentru a se potrivi.

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

Folosi pentru a analiza input siruri de caractere.

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

În data de timp, de muncă, de obicei cel mai bine pentru a defini un interval de timp de Jumătate de abordare Deschisă în cazul în care începutul este inclusive în timp ce finalul este exclusiv. Așa că vreau să știu dacă astăzi este același sau mai târziu decât la început și, de asemenea, înainte de oprire. Un purtător de cuvânt mod de a spune "este același sau mai târziu decât începutul" este ", nu înainte de a începe".

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

A se vedea Răspunsul de gstackoverflow arată lista de comparație metode pe care le puteți apela.

Despre java.timp

De java.time cadrul este construit în Java 8 și mai târziu. Aceste clase înlocui supărătoare vechi legacy data de clase, cum ar fi java.util.Data, Calendar, & SimpleDateFormat. De Joda-Time, proiect, acum în modul de întreținere, sfătuiește migrației la java.time clase. Pentru a afla mai multe, consultați Oracle Tutorial. Și de căutare Stack Overflow pentru mai multe exemple și explicații. Caietul de sarcini este JSR 310. În cazul în care pentru a obține java.timpul clase?

  • Java SE 8 și SE 9 și mai târziu
  • Built-in.
  • O parte din API-ul Java standard cu un pachet de implementare.
  • Java 9 adaugă unele caracteristici minore și corecții.
  • Java SE 6 și SE 7
  • Mai mult de java.timp de funcționalitate este adaptată pentru Java 6 & 7 în ThreeTen-Backport.
  • Android
  • A ThreeTenABP proiect se adaptează ThreeTen-Backport (menționate mai sus) pentru Android, în special.
  • A se vedea Cum să utilizați ThreeTenABP.... De ThreeTen-Extra proiectul se extinde java.timp cu clase suplimentare. Acest proiect este un teren de testare pentru posibile viitoare completări la java.timp. S-ar putea găsi unele clase utile, cum ar fi Interval, YearWeek, YearQuarter, și mai mult.

    UPDATE: Acest "Joda-Timp", secțiunea de mai jos este lăsat intact ca istorie. De Joda-Time, proiect, acum în modul de întreținere, sfătuiește migrației la java.time clase. Joda Timp

    Alte răspunsuri sunt corecte cu privire la pachet java.util.Data și java.util.Calendar cursuri. Dar aceste clase sunt foarte supărătoare. Deci, aici's un exemplu folosind codul Joda-Time 2.3 bibliotecă. Dacă îți dorești cu adevărat o data, fara nici o parte și nici de fus orar, apoi utilizați LocalDate clasă în Joda Timp. Această clasă oferă metode de comparație, inclusiv compareTo (folosit cu Java Comparatoare), isBefore, isAfter", și " egala cu. Intrări...

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

A defini un formator descrie intrare siruri de caractere...

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

Utilizați formatare pentru a analiza siruri de caractere în LocalDate obiecte...

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

Groapa de gunoi de la consola...

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

Atunci când a alerga...

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

Deci, să vedem dacă cea de-a doua este între celelalte două (exclusiv, sensul nu este egal cu nici endpoint)...

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

De Lucru Cu Deschideri De Timp

Dacă lucrați cu deschideri de timp, îți sugerez explorarea în Joda Timp pe clase: Durata, Interval, și Perioada. Metode, cum ar fi se suprapun și "conține" face comparații ușor. Pentru textul reprezentări, uita-te la standardul ISO 8601 este:

  • durata
    Format: PnYnMnDTnHnMnS
    Exemplu: P3Y6M4DT12H30M5S
    (Înseamnă "de trei ani, șase luni de zile, patru zile, douăsprezece ore, treizeci de minute și cinci secunde")
  • interval
    Format: start/end
    Exemplu: 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z Joda-Time clase poate lucra cu siruri de caractere în ambele formate, atât ca intrare (parsarea) și de ieșire (generatoare de siruri de caractere). Joda Timp efectuează comparații folosind semi-Deschis abordare în cazul în care începutul de durata e inclusive în timp ce finalul este exclusiv. Această abordare este una înțeleaptă pentru manipularea se întinde de timp. Căutare StackOverflow pentru mai multe informații.
Comentarii (0)

Compară cele două date:

  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"); 
Comentarii (3)

Update pentru Java 8 și mai târziu

Aceste metode există în LocalDate, LocalTime, LocalDateTime clase.

Aceste clase sunt construite în Java 8 și mai târziu. Mult de java.timp de funcționalitate este adaptată pentru Java 6 & 7 în ThreeTen-Backport și, de asemenea, adaptate la Android în ThreeTenABP (vezi Cum să utilizați...).

Comentarii (3)

Puteți utiliza [Data.getTime()][1], care:

Returnează numărul de milisecunde de la 1 ianuarie 1970, ora 00:00:00 GMT reprezentată de această Dată de obiect.

Acest lucru înseamnă că puteți compara-le ca numere:


if (date1.getTime() 
Comentarii (0)

Utilizarea getTime() pentru a obține valoarea numerică a datei, și apoi compara folosind valorile returnate.

Comentarii (0)

Încercați acest lucru

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;
        }
    }
Comentarii (0)

Această metodă a funcționat pentru mine:

 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;
}
Comentarii (1)

Acest cod a determina astăzi este, în unele durata.. pe baza COREEA locale

    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
    }
Comentarii (0)