D'autres réponses sont correctes, en particulier la réponse java.time par arganzheng . Comme certains l'ont mentionné, vous devriez éviter les anciennes classes java.util.Date/.Calendar car elles sont mal conçues, déroutantes et gênantes. Ils ont été supplantés par les classes java.time.
Permettez-moi d'ajouter des notes sur la stratégie concernant la gestion de minuit et les intervalles de temps .
À moitié ouvert
Dans le travail de date-heure, les intervalles de temps sont souvent définis à l'aide de l'approche «semi-ouverte». Dans cette approche, le début est inclusif tandis que la fin est exclusive . Cela résout les problèmes et, s'il est utilisé de manière cohérente, facilite grandement le raisonnement sur votre gestion de la date et de l'heure.
Un problème résolu est de définir la fin de la journée. Le dernier moment de la journée est-il 23:59:59.999
( millisecondes )? Peut-être, dans la classe java.util.Date (du premier Java; gênant - évitez cette classe!) Et dans la bibliothèque Joda-Time très réussie . Mais dans d'autres logiciels, tels que des bases de données comme Postgres, le dernier moment sera 23:59:59.999999
( microsecondes ). Mais dans d'autres logiciels tels que le framework java.time (intégré à Java 8 et versions ultérieures, successeur de Joda-Time) et dans certaines bases de données telles que H2 Database , le dernier moment pourrait être 23:59.59.999999999
( nanosecondes ). Plutôt que de couper les cheveux, pensez uniquement au premier moment, pas au dernier moment.
En demi-ouverture, une journée court à partir du premier moment d'une journée et s'étend jusqu'au premier moment du jour suivant, mais n'inclut pas . Alors plutôt que de penser comme ça:
… À partir d'aujourd'hui à 00h00 (minuit tôt ce matin) à 12h00 (minuit ce soir).
… Pense comme ça…
depuis le premier moment d'aujourd'hui jusqu'au premier moment de demain, mais sans l'inclure:
(> = 00:00:00.0
aujourd'hui ET < 00:00:00.0
demain)
Dans le travail de base de données, cette approche signifie ne pas utiliser l' BETWEEN
opérateur dans SQL.
Début de la journée
De plus, le premier moment de la journée n'est pas toujours l'heure de la journée 00:00:00.0
. L'heure d'été (DST) dans certains fuseaux horaires, et éventuellement d'autres anomalies, peut signifier qu'une heure différente commence la journée.
Laissez donc les classes java.time faire le travail de déterminer le début d'une journée avec un appel à LocalDate::atStartOfDay( ZoneId )
. Nous devons donc faire un détour LocalDate
et revenir ZonedDateTime
comme vous pouvez le voir dans cet exemple de code.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
Notez le passage de l'option ZoneId
. S'il est omis, le fuseau horaire par défaut actuel de votre JVM est appliqué implicitement. Mieux vaut être explicite.
Le fuseau horaire est crucial pour le travail date-heure. La question et certaines autres réponses sont potentiellement défectueuses car elles ne gèrent pas consciemment le fuseau horaire.
Convertir
Si vous devez utiliser un java.util.Date ou un .Calendar, recherchez les nouvelles méthodes de conversion ajoutées à ces anciennes classes.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
Période de temps
À propos, si vous travaillez beaucoup avec des intervalles de temps, jetez un œil à:
Duration
Period
Interval
La Interval
classe se trouve dans le projet ThreeTen-Extra , une extension du framework java.time. Ce projet est le terrain d'essai pour d'éventuels futurs ajouts à java.time.
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date
, Calendar
, et SimpleDateFormat
.
Le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*
classes.
Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .