tl; dr
Le projet Joda-Time est en mode maintenance, désormais supplanté par les classes java.time .
- Utilisez simplement la
java.time.Instant
classe.
- Pas besoin d:
LocalDateTime
java.sql.Timestamp
- Cordes
Capturez le moment actuel en UTC.
Instant.now()
Pour stocker ce moment dans la base de données:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Pour récupérer ce moment de la base de données:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Pour ajuster l'heure de l'horloge murale à celle d'un fuseau horaire particulier.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
est la mauvaise classe
D'autres réponses sont correctes, mais elles ne précisent pas que ce LocalDateTime
n'est pas la bonne classe pour votre objectif.
Dans java.time et Joda-Time , il LocalDateTime
manque volontairement tout concept de fuseau horaire ou de décalage par rapport à UTC. En tant que tel, il ne représente pas un moment et n'est pas un point sur la chronologie. A LocalDateTime
représente une idée approximative des moments potentiels sur une plage d'environ 26 à 27 heures.
Utilisez a LocalDateTime
pour lorsque la zone / décalage est inconnu (ce n'est pas une bonne situation), ou lorsque le décalage de zone est indéterminé. Par exemple, «Noël commence au premier moment du 25 décembre 2018» serait représenté par un LocalDateTime
.
Utilisez a ZonedDateTime
pour représenter un moment dans un fuseau horaire particulier. Par exemple, Noël commençant dans une zone particulière telle que Pacific/Auckland
ou America/Montreal
serait représenté avec un ZonedDateTime
objet.
Pour un moment toujours en UTC, utilisez Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Appliquer un fuseau horaire. Même moment, même point sur la chronologie, mais vu avec une heure d'horloge murale différente.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Donc, si je peux simplement convertir entre LocalDate et LocalDateTime,
Non, mauvaise stratégie. Si vous avez une valeur de date uniquement et que vous souhaitez une valeur de date-heure, vous devez spécifier une heure. Cette heure du jour peut ne pas être valide à cette date pour une zone particulière - auquel cas la ZonedDateTime
classe ajuste automatiquement l'heure au besoin.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Si vous voulez que le premier moment de la journée soit votre heure de la journée, laissez java.time déterminer ce moment. Ne supposez pas que la journée commence à 00h00. Des anomalies telles que l'heure d'été (DST) signifient que la journée peut commencer à une autre heure telle que 01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
est la mauvaise classe
Le java.sql.Timestamp
fait partie des anciennes classes de date-heure gênantes qui sont maintenant héritées, entièrement supplantées par les classes java.time . Cette classe était utilisée pour représenter un moment en UTC avec une résolution de nanosecondes . Cet objectif est maintenant atteint java.time.Instant
.
JDBC 4.2 avec getObject
/setObject
À partir de JDBC 4.2 et versions ultérieures, votre pilote JDBC peut directement échanger des objets java.time avec la base de données en appelant:
Par exemple:
myPreparedStatement.setObject( … , instant ) ;
… et …
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Convertir l'héritage ⬌ moderne
Si vous devez vous connecter avec un ancien code qui n'a pas encore été mis à jour vers java.time , effectuez une conversion en arrière en utilisant de nouvelles méthodes ajoutées aux anciennes classes.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…et…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
À 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 , désormais 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?
- Java SE 8 , Java SE 9 et versions ultérieures
- 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 Java SE 7
- Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
- Android
- Versions ultérieures des implémentations de bundle Android des classes java.time.
- Pour les versions antérieures d'Android (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .
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 .
java.sql.Timestamp
classe est désormais héritée, supplantée par les classes java.time , en particulier parInstant
.