tl; dr
conseiller les "meilleures pratiques" actuelles autour Date
etCalendar
est - il préférable de favoriser toujours Calendar
plusDate
Évitez complètement ces classes héritées . Utilisez plutôt des classes java.time .
Détails
La réponse par Ortomala Lokni a raison de suggérer d' utiliser les modernes java.time les classes plutôt que les classes date du temps de l' héritage vieux gênants ( Date
, Calendar
, etc.). Mais cette réponse suggère la mauvaise classe comme équivalente (voir mon commentaire sur cette réponse).
Utilisation de java.time
Les classes de java.time sont une grande amélioration par rapport à la classe date temps anciens, la différence nuit et jour. Les anciennes classes sont mal conçues, déroutantes et gênantes. Vous devriez éviter les anciennes classes autant que possible. Mais lorsque vous avez besoin de convertir vers / à partir de l'ancien / nouveau, vous pouvez le faire en appelant de nouvelles méthodes à ajouter aux anciennes classes.
Pour plus d'informations sur la conversion, voir ma réponse et le diagramme astucieux vers une autre question, Convertir java.util.Date en quel type «java.time»? .
La recherche de débordement de pile donne plusieurs centaines d'exemples de questions et réponses sur l'utilisation de java.time. Mais voici un bref résumé.
Instant
Obtenez le moment actuel avec un Instant
. La Instant
classe représente un moment sur la chronologie en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
Instant instant = Instant.now();
ZonedDateTime
Pour voir ce même moment simultané à travers l'objectif de l' heure d'une horloge murale d'une région particulière , appliquez un fuseau horaire ( ZoneId
) pour obtenir un ZonedDateTime
.
Fuseau horaire
Indiquez un nom de fuseau horaire approprié dans le format continent/region
, tels que America/Montreal
, Africa/Casablanca
ou Pacific/Auckland
. N'utilisez jamais l'abréviation de 3 à 4 lettres telles que EST
ou IST
car ce ne sont pas de véritables fuseaux horaires, ni standardisés, ni même uniques (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Décalage
Un fuseau horaire est l'histoire d'une région dans laquelle son décalage par rapport à l'UTC a changé . Mais parfois, vous ne recevez qu'un décalage sans la zone complète. Dans ce cas, utilisez la OffsetDateTime
classe.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
L'utilisation d'un fuseau horaire est préférable à l'utilisation d'un simple décalage.
LocalDateTime
Le «Local» dans les Local…
classes signifie n'importe quelle localité, pas une localité particulière. Le nom peut donc être contre-intuitif.
LocalDateTime
, LocalDate
Et LocalTime
délibérément manque aucune information sur la zone de décalage ou de temps. Ils ne représentent donc pas des moments réels, ce ne sont pas des points sur la chronologie. En cas de doute ou de confusion, utilisez ZonedDateTime
plutôt que LocalDateTime
. Search Stack Overflow pour plus de discussion.
Cordes
Ne confondez pas les objets date-heure avec des chaînes qui représentent leur valeur. Vous pouvez analyser une chaîne pour obtenir un objet date-heure et vous pouvez générer une chaîne à partir d'un objet date-heure. Mais la chaîne n'est jamais la date-heure elle-même.
Découvrez les formats ISO 8601 standard, utilisés par défaut dans les classes java.time.
À 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
, &SimpleDateFormat
.
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers java.time classes .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Utilisant un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure, vous pouvez échanger des objets java.time directement avec votre base de données. Pas besoin de chaînes ni de classes java.sql. *.
Où obtenir les classes java.time?
- Java SE 8 , Java SE 9 et versions ultérieures
- Intégré.
- Une partie de l'API Java standard avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et correctifs mineurs.
- Java SE 6 et Java SE 7
- Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
- Android
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .