Comment comparer les dates en Java? [dupliquer]

cette question a déjà une réponse ici:

  • Java: comment vérifier si une Date se situe dans une certaine fourchette? 11 réponses

comment comparer les dates en Java?

exemple:

date1 est 22-02-2010

date2 est 07-04-2010 aujourd'hui

date3 est 25-12-2010

date3 est toujours plus grand que date1 et date2 est toujours aujourd'hui. Comment puis-je vérifier si la date d'aujourd'hui est entre date1 et date 3?

331
demandé sur flotothemoon 2010-04-07 16:48:36

11 réponses

Date a avant et après méthodes et peut être par rapport à l'autre 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 aussi donner Joda-Time a go, mais notez que:

Joda-Time est le de facto standard date et heure de la bibliothèque pour Java avant Java SE 8. Les utilisateurs sont maintenant invités à migrer vers java.time ( JSR-310 ).

Les Back-ports

sont disponibles pour Java 6 et 7 ainsi que pour Android.

512
répondu Bart Kiers 2016-09-18 19:07:58

Use compareTo :

date1.compareTo(date2);

113
répondu Chandra Sekar S 2018-03-26 16:42:20

ci-dessous sont la façon la plus courante de comparer des dates. Mais j'ai préféré le premier

Approche-1 : À L'Aide De La Date.avant (), Date.après() et la Date.égal ()

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

Approche-3 : Calendrier.avant(), Calendrier.après() et de la Calandre.égal ()

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");
            }
84
répondu Sunil Kumar Sahoo 2014-01-13 07:26:04

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

la Moitié d'une approche ouverte, où le début est inclusive alors que la fin est exclusif .

mauvais choix du Format

soit dit en passant, c'est un mauvais choix de format pour une représentation textuelle d'une date ou date-valeur du temps. Dans la mesure du possible, s'en tenir aux formats standard ISO 8601 . Les formats ISO 8601 sont sans ambiguïté, compréhensibles dans toutes les cultures humaines et faciles à analyser à la machine.

pour une valeur de date seulement, le format standard est AAAA-MM-JJ. Notez comment ce format a l'avantage d'être chronologique lorsque trié par ordre alphabétique.

LocalDate

Le LocalDate La classe représente une valeur de date seulement sans Heure de la journée et sans fuseau horaire.

un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie autour du globe par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour alors qu'encore "hier" dans Montréal Québec .

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

DateTimeFormatter

comme votre les chaînes de saisie sont un format non standard, Nous devons définir un modèle de formatage pour correspondre.

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 datation-time work, habituellement mieux de définir une période de temps par l'approche semi-ouverte où le début est inclusive tandis que la fin est exclusive . Donc, nous voulons savoir si aujourd'hui est le même ou plus tard que le début et aussi avant le arrêter. Un orateur façon de dire "est la même ou plus tard que le début" n'est "pas avant le début".

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

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


à Propos de java.temps

Le de java.time framework est construit dans Java 8 et plus tard. Ces classes supplantent le vieux gênant héritage date-heure classes telles que java.util.Date , Calendar , & SimpleDateFormat .

le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers le java.temps des classes.

pour en savoir plus, voir le Oracle Tutorial . Et de la recherche Débordement de pile pour de nombreux exemples et explications. La spécification est JSR 310 .

où obtenir le java.les classes de temps?

le projet ThreeTen-Extra étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'expérimentation pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels 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 , maintenant en mode maintenance , conseille la migration vers le java.temps des classes.

Joda-Time

D'autres réponses sont correctes en ce qui concerne le Java regroupé.util.Date et java.util.Calendrier des classes. Mais ces cours sont notoirement pénibles. Voici donc un exemple de code en utilisant la bibliothèque Joda-Time 2.3.

si vous voulez vraiment une date sans aucune partie de temps et aucun fuseau horaire, puis utiliser la classe LocalDate dans Joda-Time. Cette classe fournit des méthodes de comparaison, y compris compareTo (utilisé avec Java Comparateurs ), isBefore , isAfter , et isEqual .

Entrées...

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

Définir un formateur décrivant les chaînes d'entrée...

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

utiliser formatter pour analyser les chaînes en 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 );

Vidage de la console...

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

Lors de l'exécuter...

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

ainsi voir si la seconde est entre les deux autres (exclusivement, ce qui signifie pas égal à l'un ou l'autre endpoint) ...

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

Travailler Avec Des Périodes De Temps

si vous travaillez avec des périodes 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, voir 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

Joda-les classes de temps peuvent fonctionner avec des chaînes dans ces deux formats, à la fois comme entrée (l'analyse) et de sortie (création de chaînes de caractères).

Joda-Time effectue des comparaisons en utilisant l'approche Half-Open où le début de la période est inclusive tandis que la fin est exclusive . Cette approche est judicieuse pour gérer les périodes de temps. Rechercher StackOverflow pour plus d'informations.

23
répondu Basil Bourque 2018-02-08 07:19:15

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
répondu sam 2012-06-09 06:54:49

mise à Jour pour Java 8 et plus tard

ces méthodes existent en LocalDate , LocalTime , et LocalDateTime des classes.

ces classes sont construites en Java 8 et plus tard. Une grande partie de la java.la fonctionnalité time est rétroportée en Java 6 & 7 dans ThreeTen-Backport et ensuite adaptée à Android dans ThreeTenABP (voir comment utiliser... ).

15
répondu gstackoverflow 2017-05-23 11:54:40

vous pouvez utiliser Date.getTime() qui:

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

cela signifie que vous pouvez les comparer comme les 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 <
 */
10
répondu Salman A 2015-05-15 07:18:13

utilisez getTime() pour obtenir la valeur numérique de la date, puis comparez en utilisant les valeurs retournées.

5
répondu Everyone 2010-04-07 13:18:21

Essayez cette

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
répondu Garambe 2015-11-24 11:13:33

ce code détermine aujourd'hui est dans une certaine durée.. basé sur Corée 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
    }
0
répondu Brownsoo Han 2013-11-27 07:28:19

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
répondu Iman Marashi 2017-01-06 19:37:48