java.time
L'approche moderne utilise les classes java.time qui ont remplacé les anciennes classes de date-heure gênantes fournies avec les versions les plus anciennes de Java.
La java.sql.Timestamp
classe est l'une de ces classes héritées. Ne sont plus nécessaires. À la place, utilisez Instant
ou d'autres classes java.time directement avec votre base de données en utilisant JDBC 4.2 et versions ultérieures.
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 = myResultSet.getObject( … , Instant.class ) ;
Si vous devez interagir avec un existant Timestamp
, convertissez immédiatement en java.time via les nouvelles méthodes de conversion ajoutées aux anciennes classes.
Instant instant = myTimestamp.toInstant() ;
Pour ajuster dans un autre fuseau horaire, spécifiez le fuseau horaire en tant ZoneId
qu'objet. Indiquez un nom de fuseau horaire approprié dans le format continent/region
, tels que America/Montreal
, Africa/Casablanca
ou Pacific/Auckland
. N'utilisez jamais les pseudo-zones de 3 à 4 lettres telles que EST
ou IST
car ce ne sont pas de vrais fuseaux horaires, non standardisés et même pas uniques (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Appliquer au Instant
pour produire un ZonedDateTime
objet.
ZonedDateTime zdt = instant.atZone( z ) ;
Pour générer une chaîne à afficher pour l'utilisateur, recherchez Stack Overflow pour DateTimeFormatter
trouver de nombreuses discussions et exemples.
Votre question consiste vraiment à aller dans l'autre sens, de la saisie des données utilisateur aux objets date-heure. Il est généralement préférable de diviser votre saisie de données en deux parties, une date et une heure.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Votre question n'est pas claire. Voulez-vous interpréter la date et l'heure entrées par l'utilisateur comme étant en UTC? Ou dans un autre fuseau horaire?
Si vous vouliez dire UTC, créez un OffsetDateTime
avec un décalage en utilisant la constante pour UTC, ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Si vous vouliez dire un autre fuseau horaire, combinez-le avec un objet de fuseau horaire, a ZoneId
. Mais quel fuseau horaire? Vous pouvez détecter un fuseau horaire par défaut. Ou, si critique, vous devez confirmer avec l'utilisateur pour être certain de son intention.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Pour obtenir un objet plus simple qui est toujours en UTC par définition, extrayez un fichier Instant
.
Instant instant = odt.toInstant() ;
…ou…
Instant instant = zdt.toInstant() ;
Envoyez à votre base de données.
myPreparedStatement.setObject( … , instant ) ;
À 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 .
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
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 .