2010-04-07 4 views
299

Comment puis-je comparer les dates en Java?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 supérieure à date1 et date2 est toujours aujourd'hui. Comment puis-je vérifier si la date d'aujourd'hui est entre date1 et date 3?

Répondre

473

Date a before et after méthodes et peuvent être compared to each other 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 un aller, mais notez que:

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

Les ports de retour sont disponibles pour Java 6 et 7 ainsi qu'Android.

+3

Est-ce inclus ou exclusif pour les frontières? –

+1

@ DanielHári non c'est pas inclusif. vous pouvez utiliser la solution suggérée dans le premier commentaire ou utiliser CompareTo()> = 0. – Mifmif

+0

La normale d'habitude "gauche inclusive, droite exclusive", ce pourquoi je pense que cela devrait être spécifié exactement. Avec les frontières "left inclusive, right exclusive", vous pouvez spécifier fe: un intervalle de mois facilement: [2016/04/01, 2016/05/01], c'est pourquoi c'est la normale et utilisée par défaut dans de nombreux cas d'utilisation. –

109

Utilisation compareTo:

date1.compareTo(date2);

+0

Fonctionne parfaitement avec Date, Byte, Long, Integer ... –

20

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"); 
+6

Je pense que "nouvelle Date (today.getYear(), today.getMonth() -1, today.getDay()); " c'est obsolète. http://download.oracle.com/javase/6/docs/api/java/util/Date.html –

+0

@Muath: Bien que je ne sois pas sûr à 100%, je pense que c'est parce que le composant du mois dans 'Date' est zéro-indexé. – Lii

+0

je pense que là-bas partie ne fonctionne pas :) – SMW

5

Utilisez getTime() pour obtenir la valeur numérique de la date, puis de comparer avec les valeurs retournées.

0

Ce code détermine aujourd'hui est dans une certaine durée .. sur la base locale CORÉE

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 
    } 
78

Voici les façon la plus courante de comparer les dates. Mais je préfère d'abord un

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

approche-3: Calender.before(), Calender.after() et calandre.égal à é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"); 
      } 
+0

FYI, les vieilles classes de date-heure gênantes telles que ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/ api/java/util/Date.html), ['java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html), et' java.text.SimpleDateFormat' est maintenant [legacy] (https://en.wikipedia.org/wiki/Legacy_system), supplanté par [java.time] (https://docs.oracle.com/javase/9/ docs/api/java/time/package-summary.html) classes intégrées à Java 8 et Java 9. Voir [* Tutorial * by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC. html). –

20

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 leThreeTen-Extra bibliothèque à votre projet.

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

approche semi-ouverte, où début est inclus tout en mettant fin est exclusif.

mauvais choix de Format

Soit dit en passant, qui est un mauvais choix de format pour une représentation de texte d'une date ou une date-heure. Autant que possible, respectez les formats standard ISO 8601. Les formats ISO 8601 sont non ambigus, compréhensibles à travers les cultures humaines, et faciles à analyser par machine.

Pour une valeur de date uniquement, le format standard est AAAA-MM-JJ. Notez comment 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 temps de jour 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 vos chaînes d'entrée sont au format non standard, nous devons définir un modèle de mise en forme pour correspondre.

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

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

En Date temps, généralement préférable de définir un laps de temps par l'approche semi-ouvert où le début est inclusif alors que la fin est exclusive. Nous voulons donc savoir si aujourd'hui est le même ou plus tard que le début et aussi avant l'arrêt. Une façon plus courte de dire "est le même ou plus tard que le début" est "pas avant le départ".

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

Voir the Answer by gstackoverflow pour voir la liste des méthodes de comparaison que vous pouvez appeler.


A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, Calendar, & SimpleDateFormat.Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

Pour en savoir plus, voir 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?

  • Java SE 8 et SE 9 et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android

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


MISE À JOUR: Cette section "Joda-Time" ci-dessous est laissée intacte comme historique. Le projet Joda-Time, maintenant dans maintenance mode, conseille la migration vers les classes java.time.

Joda-Time

D'autres réponses sont correctes en ce qui concerne les classes java.util.Date et java.util.Calendar empaquetés. 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 partie horaire et sans fuseau horaire, utilisez la classe LocalDate dans Joda-Time. Cette classe fournit des méthodes de comparaison, notamment compareTo (utilisée avec Java Comparators), isBefore, isAfter et isEqual.

Entrées ...

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

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

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

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

Dump à la console ...

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

Effectué ...

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

donc voir si le second est entre les deux autres (exclusivement, ce qui signifie pas égal à deux points de fin) ...

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

Travailler avec Portées Of Time

Si vous travaillez avec des durées de temps, je suggère d'explorer dans Joda-Time les classes: Duration, Interval, et Period. Des méthodes telles que overlap et contains facilitent les comparaisons.

Pour des représentations textuelles, regardez la norme de l'ISO 8601:

  • duration
    Format: PnYnMnDTnHnMnS
    Exemple: P3Y6M4DT12H30M5S
    (moyens « trois ans, six mois, quatre jours, douze heures, trente minutes, et cinq secondes »)
  • interval
    Format: début/fin
    Exemple: 2007-03-01T13: 00: 00Z/2008-05-11T15: 30: 00Z

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

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

10

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 Date.

Cela signifie que vous pouvez les comparer comme nombre:

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 < 
*/ 
15

Mise à jour pour Java 8 et versions ultérieures

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

Ces classes sont intégrées dans Java 8 et versions ultérieures. Une grande partie de la fonctionnalité java.time est reportée sur Java 6 & 7 en ThreeTen-Backport et en outre adaptée à Android en ThreeTenABP (voir How to use…).

+0

comment télécharger ces trois classes – Punithapriya

+1

@Punithapriya Ces classes existent dans la bibliothèque java 8 standart. Ainsi, il suffit de télécharger java 8 – gstackoverflow

+0

oui j'ai vu merci – Punithapriya

3

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

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

Ne répond pas à la question.La question implique * trois * dates, pas deux. "Comment vérifier si la date du jour se situe entre la date1 et la date 3?" En outre, ce calcul renvoie le nombre de périodes de 24 heures, et non le nombre de jours calendaires écoulés. Encore un autre problème: Cette réponse utilise des valeurs date-heure tandis que la Question concerne les valeurs de date-heure sans heure-de-jour. –