J'interroge les données de la base de données en utilisant le haricot de printemps 'JdbcTemplate'. L'objet retourné contient un champ de données. Le problème auquel je suis confronté est lorsque la console imprime returnedObject.getDate (). ToString ()
il renvoie "2017-08-04", mais quand je fais new Date (). )
puis il renvoie Mon Mar 25 17:36:32 GMT 2019
. J'ai lu que la classe java Date
ne contient aucun format et pour formater toute Date
, nous utilisons la classe SimpleDateFormat
. Ma question est donc de savoir quel paramètre de l'objet Date
provoque son impression dans différents formats et comment modifier son comportement?
4 Réponses :
JDBCTemplate renvoie une instance de java.sql.Date
qui étend java.util.Date
. Les JavaDocs de ce toString ()
implémentation expliquent le format de date utilisé:
Formate une date au format d'échappement de date aaaa-mm-jj.
Le toString ()
l'implémentation de java.util.Date
utilise un format date-heure plus long:
Convertit cet objet Date en une chaîne de la forme:
dow mon jj hh: mm: ss zzz aaaa
Le type de votre champ de date peut être Object
et vous pouvez toujours attribuer un java.sql.Date
ou n'importe quelle sous-classe au champ. C'est la classe d'exécution de la variable qui détermine le comportement via la répartition dynamique de la méthode, c'est-à-dire quelle implémentation de toString ()
est appelée.
Si vous souhaitez convertir la sous-classe en une instance java.util.Date
"ordinaire", vous pouvez consulter ici . Notez que la partie de temps sera toujours omise d'un DATE
SQL. Si vous avez besoin de ces informations, utilisez plutôt TIMESTAMP
.
le type de cette variable de champ est en effet java.util.Date et il est défini dans mon générateur customObjects
en récupérant la date depuis ResultSet
depuis le ResultSetExtractor
personnalisé.
Alors, est-ce que cela répond à votre question ou avez-vous d'autres préoccupations?
non, je ne suis toujours pas convaincu pourquoi ce champ de type java.util.Date
s’imprime au format «aaaa-mm-jj».
Parce que c'est ainsi que fonctionne l'héritage. Le type du champ peut être Object
et vous pouvez toujours attribuer un java.sql.Date
ou n'importe quelle sous-classe au champ. C'est la classe d'exécution de la variable qui détermine le comportement via la répartition dynamique des méthodes.
parfait! si vous ajoutez un commentaire ci-dessus dans votre réponse, j'accepterai votre réponse. Malheureusement, j'ai perdu la moitié de la journée pour une si petite chose, j'aurais dû réfléchir un peu plus.
Bien que la classe Date soit destinée à refléter le temps universel coordonné (UTC), elle peut ne pas le faire exactement, selon l'environnement hôte de la machine virtuelle Java, selon la documentation Java de la classe de date. Je pense que cela signifie qu'il regarde le format de date de votre système tandis que la requête SQL est fournie avec le format UTC. Il n'y a pas de paramètre de date qui change le format. Vous devez l'appliquer comme vous l'avez dit via le formateur de date. Regardez la classe DateFormater: https://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html En particulier la méthode de format.
lorsque j'imprime la console, renvoie l'objet.getDate (). toString () il renvoie "2017-08-04", mais quand je fais new Date (). ToString () alors il renvoie Mon 25 mars 17:36:32 GMT 2019
C'est simple.
Le code returnedObject.getDate ()
renvoie un objet de type java.sql.Date
alors que très probablement la classe Date
dans votre deuxième case est java.util.Date
.
Conformément aux docs Java de java.sql.Date
, sa méthode toString
renvoie une chaîne au format aaaa-mm-jj
.
Et selon le java docs de java.util.Date
, sa méthode toString
renvoie une chaîne dans dow mon jj hh: mm: ss zzz yyyy
format.
java.sql.Date
étend java.util.Date
. Vous pouvez obtenir les deux types de dates en ms depuis 1970 en utilisant getTime () et setTime (long time) peut être utilisé pour créer des types identiques, de sorte que vous pouvez obtenir la chaîne dans le format de votre choix.
Cependant, notez que les anciennes classes de date de Java sont inutiles (pas thread-safe, non immuables et mal nommées (ce sont des horodatages et non des dates).
Il existe des bibliothèques tierces qui sont supérieures. Regardez java.util.time qui est la nouvelle façon de le faire.
Vérifiez la méthode
toString ()
implémentée par la classe d'objet retournée parreturnedObject.getDate ()
Très probablement,java.util.Date
n'est pas le même comme classe retournée parreturnedObject.getDate ()
donc les deux renvoient deux formats différents.@PushpeshKumarRajwanshi c'est un champ Date java.util
La classe renvoyée par
returnedObject.getDate ()
doit êtrejava.sql.Date
où commenew Date ()
classe estjava.util .Date
et comme les deux sont différents, letoString ()
pour les deux sera différent.Je vous recommande de ne pas utiliser
Date
. Cette classe est mal conçue et obsolète depuis longtemps (et lejava.sql.Date
correctement mentionné dans certaines réponses aggrave encore la situation). Utilisez plutôtLocalDate
de java.time, la date et l'heure Java modernes API .