c'est-à-dire ce code
startDate = new Date(timestampValue.getTime));
donne moi :
2012-16-02 05:16:17
quand
System.out.println(timestampValue);
revenir :
2012-01-02 05: 16: 17.
Vous devriez utiliser un Calendrier à la place:
Calendar start = Calendar.getInstance();
start.setTimeInMillis( timeStampValue.getTime() );
Classe Java.sql.TimeStamp
s'étend de Java.util.Date
.
Vous pouvez assigner directement un objet TimeStamp
à Date
référence:
TimeStamp timeStamp = //whatever value you have;
Date startDate = timestampValue;
Instant instant = myResultSet.getObject( … , Instant.class ) ;
… Ou, si votre pilote JDBC ne prend pas en charge le Instant
facultatif, il doit prendre en charge OffsetDateTime
:
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Évitez les deux Java.util.Date
& Java.sql.Timestamp
. Elles ont été remplacées par les classes Java.time . Plus précisément, la classe Instant
représentant un moment sur la timeline dans UTC avec une résolution de nanosecondes (jusqu'à neuf ( 9) chiffres d'une fraction décimale).
Pour répondre à la partie principale de la question: "Pourquoi des dates différentes entre les objets Java.util.Date et Java.sql.Timestamp quand l’un est dérivé de l’autre?"
Il doit y avoir un problème avec votre code. Vous n'avez pas posté votre code, nous ne pouvons donc pas identifier le problème.
Premièrement, la valeur de chaîne que vous indiquez pour la valeur de Java.util.Date ne provient pas de sa méthode par défaut toString
;.
Deuxièmement, lorsque je lance un code similaire, j’obtiens effectivement les mêmes valeurs date-heure.
Commencez par créer un objet Java.sql.Timestamp.
// Timestamp
long millis1 = new Java.util.Date().getTime();
Java.sql.Timestamp ts = new Java.sql.Timestamp(millis1);
Extrayez maintenant le nombre de millisecondes écoulées depuis - Epoch pour instancier un objet Java.util.Date.
// Date
long millis2 = ts.getTime();
Java.util.Date date = new Java.util.Date( millis2 );
Dump des valeurs sur la console.
System.out.println("millis1 = " + millis1 );
System.out.println("ts = " + ts );
System.out.println("millis2 = " + millis2 );
System.out.println("date = " + date );
Quand couru.
millis1 = 1434666385642
ts = 2015-06-18 15:26:25.642
millis2 = 1434666385642
date = Thu Jun 18 15:26:25 PDT 2015
Le code indiqué dans la question est donc un moyen valide de convertir Java.ql.Timestamp en Java.util.Date, même si vous perdrez toutes les données nanosecondes .
Java.util.Date someDate = new Date( someJUTimestamp.getTime() );
Notez que la sortie des méthodes toString
est dans un format différent, comme documenté. Java.sql.Timestamp suit le format SQL, similaire au format ISO 8601 mais sans le T
au milieu.
Comme indiqué dans les commentaires relatifs aux autres réponses et à la question, vous devez ignorer le fait que Java.sql.Timestamp hérite de Java.util.Date. Le document j.s.Timestamp indique clairement que vous devez ne pas voir l'un comme un sous-type de l'autre: (c'est moi qui souligne)
En raison des différences entre la classe Timestamp et la classe Java.util.Date mentionnées ci-dessus, il est recommandé que le code ne visualise pas les valeurs Timestamp de manière générique en tant qu'instance de Java.util.Date . La relation d'héritage entre Timestamp et Java.util.Date dénote en réalité un héritage d'implémentation et non un héritage de type.
Si vous ignorez les conseils de l'équipe Java et adoptez une telle vue, l'un des problèmes critiques est que vous perdrez des données} _: any microseconde ou nanoseconde une partie d'une seconde susceptible de provenir de la base de données est perdue car une résolution Date n'a que millisecondes .
Fondamentalement, toutes les anciennes classes date-heure de début Java sont un grand désordre: Java.util.Date
, j.u.Calendar
, Java.text.SimpleDateFormat
, Java.sql.Timestamp
/.Date
/.Time
. C’était l’un des premiers efforts vaillants dans le domaine date-heure du secteur, mais ils ont finalement échoué. Plus précisément ici, Java.sql.Timestamp est un Java.util.Date avec des nanosecondes ajoutées, c’est un bidouillage, pas une bonne conception.
Évitez les anciennes classes date-heure associées aux premières versions de Java.
Utilisez plutôt le package Java.time ( Tutorial ) intégré à Java 8 et versions ultérieures, dans la mesure du possible.
Principes de base de Java.time… Un Instant
est un moment sur la timeline en UTC. Appliquez un fuseau horaire (ZoneId
) pour obtenir un ZonedDateTime
.
Exemple de code utilisant Java.time à partir de Java 8. Avec un pilote JDBC prenant en charge JDBC version 4.2 ou ultérieure, vous pouvez échanger directement des classes Java.time avec votre base de données; vous n’avez plus besoin des classes héritées.
Instant instant = myResultSet.getObject( … , Instant.class) ; // Instant is the raw underlying data, an instantaneous point on the time-line stored as a count of nanoseconds since Epoch.
Vous voudrez peut-être vous adapter à un fuseau horaire autre que UTC.
ZoneId z = ZoneId.of( "America/Montreal" ); // Always make time zone explicit rather than relying implicitly on the JVM’s current default time zone being applied.
ZonedDateTime zdt = instant.atZone( z ) ;
Effectuez votre logique métier. Ici, nous ajoutons simplement un jour.
ZonedDateTime zdtNextDay = zdt.plusDays( 1 ); // Add a day to get "day after".
À la dernière étape, si nécessaire, convertissez-la en Java.util.Date pour assurer son interopérabilité.
Java.util.Date dateNextDay = Date.from( zdtNextDay.toInstant( ) ); // WARNING: Losing data (the nanoseconds resolution).
Dump à la console.
System.out.println( "instant = " + instant );
System.out.println( "zdt = " + zdt );
System.out.println( "zdtNextDay = " + zdtNextDay );
System.out.println( "dateNextDay = " + dateNextDay );
Quand couru.
instant = 2015-06-18T16:44:13.123456789Z
zdt = 2015-06-18T19:44:13.123456789-04:00[America/Montreal]
zdtNextDay = 2015-06-19T19:44:13.123456789-04:00[America/Montreal]
dateNextDay = Fri Jun 19 16:44:13 PDT 2015
Si vous devez utiliser les types hérités pour interfacer avec l'ancien code non encore mis à jour pour Java.time, vous pouvez convertir. Utilisez les nouvelles méthodes ajoutées aux anciennes classes Java.util.Date et Java.sql. * Pour la conversion.
Instant instant = myJavaSqlTimestamp.toInstant() ;
…et…
Java.sql.Timestamp ts = Java.sql.Timestamp.from( instant ) ;
Reportez-vous au chapitre Didacticiel, Code de date/heure hérité , pour plus d'informations sur les conversions.
Soyez conscient de la résolution de la fraction de seconde. Les conversions de nanosecondes en millisecondes signifient potentiellement la perte de certaines données.
Le framework Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien et problématique hérité date-heure des classes telles que Java.util.Date
, Calendar
, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode de maintenance , indique la migration vers les classes Java.time .
Pour en savoir plus, consultez le tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 31 .
Vous pouvez échanger des objets Java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de chaînes, pas besoin de classes Java.sql.*
.
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 ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval
, YearWeek
, YearQuarter
et plus .
Le problème vient probablement du fait que Date est obsolète.
Pensez à utiliser
Java.util.Calendar
ou
Éditer 2015:
Java 8 et les versions ultérieures intègrent le nouveau package Java.time , qui est similaire à Joda-Time .
public static Date convertTimestampToDate(Timestamp timestamp) {
Instant ins=timestamp.toLocalDateTime().atZone(ZoneId.systemDefault()).toInstant();
return Date.from(ins);
}
La nouvelle façon élégante Java 8) est Date.from(timestamp.toInstant())
]. Voir ma réponse similaire ailleurs .
L'horodatage est une date: https://docs.Oracle.com/javase/7/docs/api/Java/sql/Timestamp.html
Java.lang.Object
Java.util.Date
Java.sql.Timestamp
Java.sql.ResultSet rs;
//fill rs somehow
Java.sql.Timestamp timestamp = rs.getTimestamp(1); //get first column
long milliseconds = timestamp.getTime() + (timestamp.getNanos() / 1000000);
Java.util.Date date = return new Java.util.Date(milliseconds);