Comment faire pour convertir à partir de java.sql.Horodatage de java.util.Date?
c'est à dire ce code
startDate = new Date(timestampValue.getTime));
me donne :
2012-16-02 05:16:17
quand
System.out.println(timestampValue);
retour :
2012-01-02 05:16:17.0
- Que voulez-vous faire avec eux? Voulez-vous qu'ils ont la même représentation de Chaîne ou voulez-vous convertir les objets de programmation?
- la question dans un topic 🙂 Comment faire pour convertir à partir de java.sql.Horodatage de java.util.Date?... ce que je veux faire? juste convertir le Timestamp de la Date et ont la même valeurs... je sais... ce Jour n'ont pas de nanosecondes... dosent la matière...
- Pas besoin de se convertir. Un Horodatage est une Date.
- Si elle soo simple et Timestamp d'une Date de dire à mes pourquoi il y a une différence...? dans l'exemple.... avec avant et après la conversion?
- double possible de Comment convertir le TimeStamp de la Date en Java?
- Que d'autres Question n'est pas l'original, c'est venu après celui-ci.
- Votre commentaire est incorrect et mal avisé. Bien que techniquement correct, un java.sql.Timestamp ne hérite de java.util.Date, que l'héritage est un hack. La doc explicitement dit que vous ne devriez pas envisager j.sql.Timestamp comme une sous-classe de j.u.Date. Voir le commentaire de Alex Shesterov sur cette Réponse.
InformationsquelleAutor Marcin Petrów | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un Calendrier à la place:
Classe
java.sql.TimeStamp
s'étend dejava.util.Date
.Vous pouvez affecter directement une
TimeStamp
objet deDate
référence:Due to the differences between the Timestamp class and the java.util.Date class ... it is recommended that code not view Timestamp values generically as an instance of java.util.Date. The inheritance relationship between Timestamp and java.util.Date really denotes implementation inheritance, and not type inheritance.
tl;dr
...ou, si votre pilote JDBC ne prend pas en charge l'option
Instant
, il est nécessaire de soutenirOffsetDateTime
:Éviter à la fois
java.util.Date
&java.sql.Timestamp
. Ils ont été remplacés par le java.le temps classes. Plus précisément, leInstantané
classe représentant un instant sur la timeline dans UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).Différentes Valeurs → Non Vérifiées Problème
À l'adresse de la partie principale de la Question: "Pourquoi des dates différentes entre java.util.Date et java.sql.Horodatage des objets lorsque l'on est dérivé de l'autre?"
Il doit y avoir un problème avec votre code. Vous n'avez pas de poster votre code, donc on ne peut pas identifier le problème.
Tout d'abord, que la valeur de chaîne que vous montrez la valeur de java.util.La Date n'est pas venu de son défaut
toString
méthode, donc, de toute évidence vous faisiez des opérations supplémentaires.Deuxièmement, lorsque j'exécute le même code que je dois en effet obtenir exactement la même date de valeurs de temps.
D'abord créer un projet java.sql.Horodatage de l'objet.
Maintenant extraire le comte de millisecondes depuis leépoque pour instancier un java.util.L'objet Date.
Dump les valeurs de la console.
Lors de l'exécuter.
De sorte que le code indiqué dans la Question est en effet un moyen valable de convertir à partir de java.sql.Horodatage de java.util.Ce jour, même si vous perdez tout nanosecondes de données.
Différents Formats De Sortie De Chaîne
Noter que la sortie de la
toString
méthodes est un autre format, tel que documenté. La java.sql.Timestamp suit format SQL, semblable à ISO 8601 format mais sans leT
dans le milieu.Ignorer L'Héritage
Comme discuté dans les commentaires sur d'autres Réponses et une Question, vous devez ignorer le fait que java.sql.Timestamp hérite de java.util.Date. Le j.s.Timestamp doc indique clairement que vous devez pas vue comme un sous-type de l'autre: (l'emphase est mienne)
Si vous ignorez l'équipe Java de conseils et de prendre un tel point de vue, un problème critique est que vous risquez de perdre des données: tout microseconde ou l'ordre de la nanoseconde partie de seconde qui peut venir de la base de données est perdue comme une Date a seulement milliseconde résolution.
Fondamentalement, toutes les vieilles date à temps des classes à partir de début Java sont un gros gâchis:
java.util.Date
,j.u.Calendar
,java.text.SimpleDateFormat
,java.sql.Timestamp
/.Date
/.Time
. Ils ont été l'un des premiers courageux efforts à une date-heure-cadre dans l'industrie, mais ils finissent par échouer. Plus précisément ici, de java.sql.Timestamp est un java.util.Date avec nanosecondes cloué sur, c'est un hack, pas de bonne conception.java.temps
Éviter la vieille date-heure classes livré avec les premières versions de Java.
Au lieu d'utiliser l' java.en temps (Tutoriel) intégré dans Java 8 et, plus tard, chaque fois que possible.
Notions de base de java.le temps... Un
Instant
est un moment sur la ligne de temps en temps UTC. Appliquer un fuseau horaire (ZoneId
) pour obtenir unZonedDateTime
.Un exemple de code utilisant java.le temps de Java 8. Avec un pilote JDBC de soutien JDBC 4.2 et versions ultérieures, vous pouvez échanger directement java.les classes de temps avec votre base de données; aucun besoin pour les classes héritées.
Vous pouvez ajuster dans un fuseau horaire autre que l'UTC.
Effectuer votre logique métier. Ici, nous avons simplement ajouter un jour.
À la dernière étape, si cela est absolument nécessaire, convertir de un java.util.Date de l'interopérabilité.
De vidage de la console.
Lors de l'exécuter.
Conversions
Si vous devez utiliser l'héritage de types d'interface avec l'ancien code pas encore mis à jour pour java.temps, vous pouvez convertir. L'utilisation de nouvelles méthodes ajoute à l'ancienne java.util.Date et java.sql.* classes pour la conversion.
...et...
Voir le Tutoriel chapitre, L'Héritage De La Date-Time Code, pour plus d'informations sur les conversions.
À La Fraction De Seconde
Être au courant de la résolution de la fraction de seconde. Les Conversions de nanosecondes à quelques millisecondes signifie potentiellement la perte de certaines données.
Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.Le problème est probablement dû au fait que la Date est obsolète.
Envisager d'utiliser
java.util.Calendrier
ou
Joda-Time
Édition 2015:
Java 8 et, plus tard, a intégré dans la nouvelle java.en temps, qui est similaire à Joda-Time.
Interval
). Au dernier moment, de les convertir en java.util.Là où ce sera nécessaire pour l'interopérabilité par l'appel deDateTime::toDate
méthode de Joda-Time, ou le java.temps de voir le Tutoriel sur Héritage de Date-Heure de Code.La nouvelle fantaisie de Java 8 est
Date.from(timestamp.toInstant())
. Voir mon semblable réponse d'ailleurs.2015-12-03 15:37:59.503
Timestamp d'une Date: https://docs.oracle.com/javase/7/docs/api/java/sql/Timestamp.html