tl; dr
Utilisez uniquement des classes java.time modernes . Ne jamais utiliser les classes terribles hérités tels que SimpleDateFormat
, Date
ou java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
Ou utilisez le fuseau horaire par défaut actuel de la JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time et JDBC 4.2
L'approche moderne utilise les classes java.time comme vu ci-dessus.
Si votre pilote JDBC est conforme à JDBC 4.2 , vous pouvez directement échanger des objets java.time avec la base de données. Utilisez PreparedStatement::setObject
et ResultSet::getObject
.
Utilisez java.sql uniquement pour les pilotes antérieurs à JDBC 4.2
Si votre pilote JDBC n'est pas encore conforme à JDBC 4.2 pour la prise en charge des types java.time , vous devez revenir à l'utilisation des classes java.sql.
Stocker des données.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Récupération des données.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Les types java.sql, tels que java.sql.Timestamp
, ne doivent être utilisés que pour le transfert vers et depuis la base de données. Conversion immédiate en types java.time dans Java 8 et versions ultérieures.
java.time.Instant
A java.sql.Timestamp
correspond à un java.time.Instant
, un moment de la chronologie en UTC. Notez la nouvelle méthode de conversion toInstant
ajoutée à l'ancienne classe.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Fuseau horaire
Appliquez le fuseau horaire souhaité / attendu ( ZoneId
) pour obtenir un fichier ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Chaînes formatées
Utilisez a DateTimeFormatter
pour générer votre chaîne. Les codes de motif sont similaires à ceux de java.text.SimpleDateFormat
mais pas exactement, alors lisez attentivement la documentation.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Ce format particulier est ambigu quant à sa signification exacte car il ne dispose d'aucune indication de décalage par rapport à UTC ou de fuseau horaire.
ISO 8601
Si vous avez un mot à dire sur le sujet, je vous suggère d'envisager d'utiliser les formats standard ISO 8601 plutôt que de rouler les vôtres. Le format standard est assez similaire au vôtre. Par exemple:
2016-02-20T03:26:32+05:30
.
Les classes java.time utilisent ces formats standard par défaut, il n'est donc pas nécessaire de spécifier un modèle. La ZonedDateTime
classe étend le format standard en ajoutant le nom du fuseau horaire (une amélioration judicieuse).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Convertir en java.sql
Vous pouvez reconvertir de java.time vers java.sql.Timestamp
. Extrait un Instant
du ZonedDateTime
.
De nouvelles méthodes ont été ajoutées aux anciennes classes pour faciliter la conversion vers / depuis les classes java.time.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.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 .