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.
Est-ce inclus ou exclusif pour les frontières? –
@ DanielHári non c'est pas inclusif. vous pouvez utiliser la solution suggérée dans le premier commentaire ou utiliser CompareTo()> = 0. – Mifmif
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. –