Comment comparer les dates en Java? [dupliquer]
cette question a déjà une réponse ici:
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?
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:
Les Back-portsJoda-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 ).
sont disponibles pour Java 6 et 7 ainsi que pour Android.
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");
}
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?
- Java SE 8 et SE 9 et plus tard
- Built-in.
- fait partie de L'API Java standard avec une application.
- Java 9 ajoute des fonctionnalités mineures et des corrections.
- Java SE 6 et SE 7
- une grande partie de la java.la fonctionnalité time est rétroportée à Java 6 & 7 dans ThreeTen-Backport .
- Android
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.
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");
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... ).
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 <
*/
utilisez getTime() pour obtenir la valeur numérique de la date, puis comparez en utilisant les valeurs retournées.
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;
}
}
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
}
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;
}