1
votes

La méthode Date toString () renvoie différentes chaînes

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 commentaires

Vérifiez la méthode toString () implémentée par la classe d'objet retournée par returnedObject.getDate () Très probablement, java.util.Date n'est pas le même comme classe retournée par returnedObject.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 être java.sql.Date où comme new Date () classe est java.util .Date et comme les deux sont différents, le toString () 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 le java.sql.Date correctement mentionné dans certaines réponses aggrave encore la situation). Utilisez plutôt LocalDate de java.time, la date et l'heure Java modernes API .


4 Réponses :


2
votes

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 .


5 commentaires

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.



0
votes

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.


0 commentaires

1
votes

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.


0 commentaires

0
votes

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.


0 commentaires