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 le Trois-Dix-Extra à votre projet.
LocalDateRange.of(
LocalDate.of( … ) ,
LocalDate.of( … )
).contains(
LocalDate.now()
)
Approche semi-ouverte, où le début est inclusivement alors que la fin est exclusif .
Mauvais choix de format
À propos, c'est un mauvais choix de format pour la représentation textuelle d'une valeur de date ou d'heure. Dans la mesure du possible, utilisez le format standard ISO 8601 les formats. Les formats ISO 8601 sont sans ambiguïté, compréhensibles par toutes les cultures humaines et faciles à analyser par une machine.
Pour une valeur de type date uniquement, le format standard est YYYY-MM-DD. Notez que ce format a l'avantage d'être chronologique lorsqu'il est trié par ordre alphabétique.
LocalDate
Le site LocalDate
représente une valeur de date uniquement, sans heure du jour et sans fuseau horaire.
Le fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie selon les zones du globe. Par exemple, quelques minutes après minuit en France, le jour de la fête du travail est le jour de la fête du travail. Paris France est un nouveau jour alors qu'il est encore "hier" dans le monde. Montréal Québec .
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
Comme vos chaînes d'entrée ont un format non standard, nous devons définir un modèle de formatage à faire correspondre.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );
Utilisez-le 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 cadre d'un travail sur la date et l'heure, il est généralement préférable de définir une période de temps par l'approche de la demi-ouverture, où le début est le suivant inclusivement alors que la fin est exclusif . Nous voulons donc savoir si aujourd'hui est identique ou postérieur au début et aussi avant l'arrêt. Une façon plus brève de dire "est le même 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 de gstackoverflow montrant la liste des méthodes de comparaison que vous pouvez appeler.
À propos de java.time
Le site java.time est intégré à Java 8 et aux versions ultérieures. Ces classes remplacent les anciennes classes héritage les classes de date et d'heure telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez sur Stack Overflow de nombreux exemples et explications. La spécification est JSR 310 .
Le site Joda-Time Le projet, actuellement en mode de maintenance conseille la migration vers le java.time classes.
Vous pouvez échanger java.time directement avec votre base de données. Utilisez un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin de java.sql.*
classes. Support de Hibernate 5 et JPA 2.2 java.time .
Où obtenir les classes java.time ?
Le site Trois-Dix-Extra Le projet étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval
, YearWeek
, YearQuarter
et plus .
UPDATE : Cette section "Joda-Time" ci-dessous est laissée intacte en tant qu'histoire. Le site Joda-Time Le projet, actuellement en mode de maintenance conseille la migration vers le java.time classes.
Joda-Time
Les autres réponses sont correctes en ce qui concerne les classes groupées java.util.Date et java.util.Calendar. Mais ces classes sont notoirement difficiles à utiliser. Voici donc un exemple de code utilisant la classe Joda-Time 2.3 bibliothèque.
Si vous voulez vraiment une date sans portion de temps et sans fuseau horaire, utilisez alors la fonction LocalDate
dans Joda-Time. Cette classe fournit des méthodes de comparaison, notamment compareTo
(utilisé avec Comparateurs Java ), 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" );
Utilisez le formateur pour analyser les chaînes de caractères 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 );
Quand on court
Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true
Alors, voyez si le second se situe entre les deux autres (exclusivement, c'est-à-dire non égal à l'une ou l'autre des extrémités)
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 vous suggère d'explorer les classes de Joda-Time : Durée , Intervalle et Période . Des méthodes telles que overlap
et contains
faciliter les comparaisons.
Pour les représentations textuelles, regardez celles de 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
Example: 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z
Les classes Joda-Time peuvent travailler avec des chaînes de caractères dans ces deux formats, à la fois en entrée (analyse syntaxique) et en sortie (génération de chaînes de caractères).
Joda-Time effectue les comparaisons en utilisant la fonction Demi-ouvert approche où le début de la portée est inclusivement alors que la fin est exclusif . Cette approche est judicieuse pour gérer les périodes de temps. Recherchez StackOverflow pour plus d'informations.