web-dev-qa-db-fra.com

Comment comparer les dates en Java?

Comment comparer les dates entre Java?

Exemple:

date1 est 22-02-2010
date2 est 07-04-2010 aujourd'hui
date3 est 25-12-2010

date3 est toujours supérieur à date1 et date2 est toujours aujourd'hui. Comment vérifier si la date d'aujourd'hui se situe entre la date1 et la date 3?

363
ant

Date a avant et après méthodes et peut être comparé les unes aux autres comme suit:

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

Pour une comparaison inclusive:

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

Vous pouvez également donner Joda-Time un essai, mais notez que:

Joda-Time est la bibliothèque de dates et d'heures standard de facto pour Java antérieure à Java SE 8. Les utilisateurs sont maintenant invités à migrer vers Java.time ( JSR-31 ).

Les ports arrière sont disponibles pour Java 6 et 7, ainsi que pour Android.

561
Bart Kiers

Utilisez compareTo :

date1.compareTo(date2);

125
Chandra Sekar

Voici le moyen le plus courant de comparer les dates. Mais j'ai prefere le premier

Approche-1: Utilisation de Date.before (), Date.after () et 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");
            }

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

Approach-3: Calender.before (), Calender.after () et 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");
            }
91
Sunil Kumar Sahoo

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

Ou mieux, si vous ajoutez la bibliothèque ThreeTen-Extra à votre projet.

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

Approche semi-ouverte, où le début est inclusif tandis que la fin est exclusif.

Mauvais choix de format

À propos, c’est un mauvais choix de format pour une représentation textuelle d’une date ou d’une valeur date-heure. Autant que possible, respectez les formats standard ISO 8601 . Les formats ISO 8601 sont sans ambiguïté, compréhensibles pour toutes les cultures humaines et faciles à analyser à la machine.

Pour une valeur de date uniquement, le format standard est AAAA-MM-JJ. Notez que ce format a l'avantage d'être chronologique lorsqu'il est trié par ordre alphabétique.

LocalDate

La classe LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde entier par zone. Par exemple, quelques minutes après minuit à Paris France est un nouveau jour alors qu’il est encore "hier" à Montréal Québec .

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

DateTimeFormatter

Comme vos chaînes d’entrée sont au format non standard, nous devons définir un modèle de mise en forme correspondant.

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

Utilisez cela pour analyser les chaînes d'entrée.

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

Dans le travail date-heure, il est généralement préférable de définir un intervalle de temps selon l'approche Half-Open, où le début est inclusif tandis que la fin est exclusif. Nous voulons donc savoir si aujourd'hui est identique ou plus tard que le début et aussi avant l'arrêt. Une façon plus brève de dire "est identique ou plus tard que le début" est "pas avant le début".

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

Voir la réponse par gstackoverflow montrant la liste des méthodes de comparaison que vous pouvez appeler.


À propos de Java.time

Le framework Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes et obsolètes anciennes classes telles que Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , désormais en mode de maintenance , recommande la migration vers les classes Java.time .

Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time?

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez trouver ici des classes utiles telles que Interval , YearWeek , YearQuarter et plus .


MISE À JOUR: Cette section "Joda-Time" ci-dessous est laissée intacte en tant qu'historique. Le projet Joda-Time , désormais en mode de maintenance , conseille de migrer vers les classes Java.time .

Joda-Time

Les autres réponses sont correctes en ce qui concerne les classes Java.util.Date et Java.util.Calendar fournies. Mais ces classes sont notoirement gênantes. Voici donc un exemple de code utilisant la bibliothèque Joda-Time 2.3.

Si vous voulez vraiment une date sans tranche horaire ni fuseau horaire, utilisez la classe LocalDate dans Joda-Time. Cette classe fournit des méthodes de comparaison comprenant compareTo (utilisé avec comparateurs Java ), isBefore, isAfter et isEqual.

Contributions…

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

Définir un formateur décrivant les chaînes en entrée…

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

Utilisez le formateur pour analyser les chaînes dans les objets LocalDate…

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

Décharger pour consoler…

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

Quand couru…

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

Donc, voyez si le second est entre les deux autres (exclusivement, ce qui signifie différent de l'un ou l'autre des critères)…

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

Travailler avec des durées

Si vous travaillez avec des plages de temps, je suggère d'explorer dans Joda-Time les classes: Durée , Intervalle et Période . Des méthodes telles que overlap et contains facilitent les comparaisons.

Pour les représentations textuelles, regardez la norme ISO 8601:

  • durée
    Format: PnYnMnDTnHnMnS
    Exemple: P3Y6M4DT12H30M5S
    (Signifie "trois ans, six mois, quatre jours, douze heures, trente minutes et cinq secondes")
  • intervalle
    Format: début/fin
    Exemple: 2007-03-01T13: 00: 00Z/2008-05-11T15: 30: 00Z

Les classes Joda-Time peuvent travailler avec des chaînes dans ces deux formats, à la fois en entrée (analyse) et en sortie (génération de chaînes).

Joda-Time effectue des comparaisons en utilisant l'approche semi-ouverte où le début de l'intervalle est inclusif alors que la fin est - exclusif. Cette approche est judicieuse pour gérer des périodes de temps. Recherchez StackOverflow pour plus d'informations.

28
Basil Bourque

Comparez les deux dates:

  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

Mise à jour pour Java 8 et versions ultérieures

Ces méthodes existent dans les classes LocalDate , LocalTime et LocalDateTime .

Ces classes sont intégrées à Java 8 et versions ultérieures. Une grande partie de la fonctionnalité Java.time est rétroportée sur Java 6 & 7 sous ThreeTen-Backport et est ensuite adaptée à Android. dans ThreeTenABP (voir Comment utiliser… ).

14
gstackoverflow

Vous pouvez utiliser Date.getTime() qui:

Retourne le nombre de millisecondes depuis le 1er janvier 1970, 00:00:00 GMT représenté par cet objet Date.

Cela signifie que vous pouvez les comparer comme des nombres:

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

Essaye ça

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

Utilisez getTime () pour obtenir la valeur numérique de la date, puis comparez-la à l'aide des valeurs renvoyées.

4
Everyone

Ce code détermine aujourd'hui est dans une certaine durée .. basé sur les paramètres régionaux 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

Cette méthode a fonctionné pour moi:

 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