tl; dr
Comment convertir java.util.Date en java.sql.Date?
Non. Les deux classes sont dépassées.
- Utilisez les classes java.time au lieu de legacy
java.util.Date
& java.sql.Date
avec JDBC 4.2 ou version ultérieure.
- Convertir vers / à partir de java.time si interagissant avec du code non encore mis à jour vers java.time.
Exemple de requête avec PreparedStatement
.
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
Remplaçants:
Instant
au lieu de java.util.Date
Both représentent un moment en UTC. mais maintenant avec des nanosecondes au lieu de millisecondes.
LocalDate
au lieu de java.sql.Date
Both représentent une valeur de date uniquement sans heure et sans fuseau horaire.
Détails
Si vous essayez de travailler avec des valeurs de date uniquement (pas d'heure, pas de fuseau horaire), utilisez LocalDate
plutôt la classe que java.util.Date
.
java.time
Dans Java 8 et versions ultérieures, les anciennes classes de date-heure gênantes regroupées avec les premières versions de Java ont été remplacées par le nouveau package java.time . Voir Oracle Tutorial . Une grande partie de la fonctionnalité a été rétroportée vers Java 6 et 7 dans ThreeTen-Backport et adaptée à Android dans ThreeTenABP .
Un type de données SQL DATE
est censé être à date uniquement, sans heure et sans fuseau horaire. Java n'a jamais eu précisément une telle classe † qu'en java.time.LocalDate
Java 8. Créons une telle valeur en obtenant la date d'aujourd'hui en fonction d'un fuseau horaire particulier (le fuseau horaire est important pour déterminer une date comme un nouveau jour se lève plus tôt à Paris qu'à Montréal, pour exemple).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
À ce stade, nous pouvons avoir terminé. Si votre pilote JDBC est conforme à la spécification JDBC 4.2 , vous devriez pouvoir passer un LocalDate
via setObject
sur un PreparedStatement
pour le stocker dans un champ SQL DATE.
myPreparedStatement.setObject( 1 , localDate );
De même, utilisez ResultSet::getObject
pour extraire d'une colonne SQL DATE vers un LocalDate
objet Java . La spécification de la classe dans le deuxième argument rend votre code sûr pour le type .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
En d'autres termes, toute cette question n'est pas pertinente sous JDBC 4.2 ou version ultérieure.
Si votre pilote JDBC ne fonctionne pas de cette manière, vous devez vous replier sur la conversion aux types java.sql.
Convertir en java.sql.Date
Pour convertir, utilisez de nouvelles méthodes ajoutées aux anciennes classes date-heure. Nous pouvons appeler java.sql.Date.valueOf(…)
pour convertir un LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
Et aller dans l'autre sens.
LocalDate localDate = sqlDate.toLocalDate();
Conversion de java.util.Date
Bien que vous deviez éviter d'utiliser les anciennes classes de date-heure, vous pourriez être obligé de le faire lorsque vous travaillez avec du code existant. Si c'est le cas, vous pouvez convertir vers / depuis java.time.
Parcourez la Instant
classe, qui représente un moment de la chronologie en UTC. Une Instant
idée est similaire à une java.util.Date
. Mais notez qu'il Instant
a une résolution jusqu'à nanosecondes alors qu'il java.util.Date
n'a qu'une résolution en millisecondes .
Pour convertir, utilisez de nouvelles méthodes ajoutées aux anciennes classes. Par exemple, java.util.Date.from( Instant )
et java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Pour déterminer une date, nous avons besoin du contexte d'un fuseau horaire. Pour un moment donné, la date varie dans le monde entier par fuseau horaire. Appliquez un ZoneId
pour obtenir un ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† La classe java.sql.Date prétend être datée uniquement sans heure, mais fait en fait une heure, ajustée à minuit. Déroutant? Oui, les anciennes classes de date-heure sont un gâchis.
À 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.*
cours.
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 de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .