Réponses:
Par Timestamp
, je suppose que vous voulez dire java.sql.Timestamp
. Vous remarquerez que cette classe a un constructeur qui accepte un long
argument. Vous pouvez analyser cela en utilisant la DateFormat
classe:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
et java.text.SimpleDateFormat
sont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .
Et ça?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Que voulez-vous dire horodatage? Si vous voulez dire millisecondes depuis l'époque Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Si vous voulez un objet java.sql.Timestamp réel:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Mettons à jour cette page en affichant le code à l'aide de java.time framework intégré à Java 8 et supérieur.
Ces nouvelles classes sont inspirées de Joda-Time , défini par JSR 310 , et étendues par le ThreeTen-Extra projet . Ils remplacent les anciennes classes date-heure notoirement gênantes fournies avec les premières versions de Java.
Dans java.time, an Instant
est un moment sur la chronologie en UTC. A ZonedDateTime
est un instant ajusté dans un fuseau horaire ( ZoneId
).
Le fuseau horaire est crucial ici. Une date de September 23, 2007
ne peut pas être traduite en un moment de la chronologie sans appliquer un fuseau horaire. Considérez qu'un nouveau jour se lève plus tôt à Paris qu'à Montréal où il est encore «hier».
En outre, un java.sql.Timestamp représente à la fois une date et une heure du jour. Il faut donc injecter une heure pour accompagner la date. Nous supposons que vous voulez que le premier moment de la journée soit l'heure de la journée. Notez que ce n'est pas toujours le moment00:00:00.0
cause de l'heure d'été et éventuellement d'autres anomalies.
Notez que contrairement à l'ancienne classe java.util.Date, et contrairement à Joda-Time, les types java.time ont une résolution de nanosecondes plutôt que de millisecondes. Cela correspond à la résolution de java.sql.Timestamp.
Notez que java.sql.Timestamp a la mauvaise habitude d'appliquer implicitement le fuseau horaire par défaut actuel de votre JVM à sa valeur date-heure lors de la génération d'une représentation sous forme de chaîne via sa toString
méthode. Ici, vous voyez mon America/Los_Angeles
fuseau horaire appliqué. En revanche, les classes java.time sont plus saines, utilisant les formats standard ISO 8601 .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Dump dans la console.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Lorsqu'il est exécuté.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Amérique / Montréal] = instant: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00,0
D'ailleurs, à partir de JDBC 4.2, vous pouvez utiliser directement les types java.time. Pas besoin de java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
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.*
classes.
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 futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .
Vous pouvez également effectuer les opérations suivantes:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
Selon l' API, le constructeur qui accepterait l'année, le mois, etc. est obsolète. Au lieu de cela, vous devez utiliser le constructeur qui accepte un long. Vous pouvez utiliser une implémentation de Calendar pour construire la date souhaitée et accéder à la représentation temporelle sous forme de long, par exemple avec la méthode getTimeInMillis .
Par souci d'exhaustivité, également une solution avec Joda-Time version 2.5 et sa DateTime
classe:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
objet. Cela signifie que vos résultats varieront selon les ordinateurs ou la configuration des paramètres du système d'exploitation hôte ou de la JVM. Pour des résultats prévisibles, transmettez un fuseau horaire à ce DateTime
constructeur. Choisissez le nom de fuseau horaire approprié pour votre intention. Par exemple, DateTimeZone.forID( "America/Montreal" )
ou DateTimeZone.UTC
.
DateTime
objet ses millisecondes depuis l'époque. Remplacez .toDate().getTime()
par .getMillis()
.
DateTimeZone.getDefault()
et en passant le résultat comme argument facultatif. (Au fait, idem pour Locale.getDefault()
, même problème sur l'ambiguïté des arguments optionnels.)
Une réponse plus générale serait d'importer java.util.Date
, puis lorsque vous devez définir un timestamp
égal à la date actuelle, il suffit de le définir égal à new Date()
.