Java Timestamp-Comment puis-je créer un horodatage avec la date 23/09/2007?


Comment puis-je créer un horodatage avec la date 23/09/2007?

Author: Glen, 2009-06-10

8 answers

Par Timestamp, je présume que tu veux dire java.sql.Timestamp. Vous remarquerez que cette classe a un constructeur qui accepte un long argument. Vous pouvez analyser cela en utilisant la classe DateFormat:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
 134
Author: Adam Paynter, 2009-06-10 11:19:54

Qu'en est-il de cela?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
 99
Author: pigouina, 2016-06-24 10:27:58

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 java réel.SQL.Objet horodatage:

Timestamp ts = new Timestamp(millis);
 16
Author: Matthew Flaschen, 2009-06-10 13:54:02

Tl; dr

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .asStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

Java.temps

Mettons à jour cette page en affichant le code en utilisant le java.time framework intégré dans Java 8 et versions ultérieures.

Ces nouvelles classes sont inspirés par Joda-Time, défini par JSR 310, prolongé par la ThreeTen-Extra projet. Ils supplantent les anciennes classes date-heure notoirement gênantes fournies avec les premières versions de Java.

En java.temps, un Instant est un moment dans le scénario de L'UTC. Un 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 sur la timeline sans appliquer un fuseau horaire. Considérez qu'un jour nouveau se lève plus tôt à Paris qu'à Montréal où c'est encore "hier".

Aussi, un java.SQL.Timestamp représente à la fois une date et une heure de la journée. Nous devons donc injecter une heure de la journée pour accompagner la date. Nous supposons que vous voulez le premier moment de la journée comme l'heure de la journée. Notez que ce n'est pas toujours l'heure 00:00:00.0 en raison de l'heure d'été et éventuellement d'autres anomalies.

Notez que contrairement à l'ancien java.util.Classe Date, et contrairement à Joda-Time, le java.les types de temps ont une résolution de nanosecondes plutôt que de millisecondes. Cela correspond à la résolution de java.SQL.Timestamp.

Notez que le 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 chaîne représentation via sa méthode toString. Ici, vous voyez mon America/Los_Angeles fuseau horaire appliqué. En revanche, le java.les classes de temps sont plus saines, en utilisant les formats standard ISO 8601.

LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.asStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;

Vidage sur console.

System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );

Lors de l'exécution.

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

En passant, à partir de JDBC 4.2, vous pouvez utiliser java.types de temps directement. Pas besoin de java.sql.Timestamp.

  • PreparedStatement.setObject
  • ResultSet.getObject
 7
Author: Basil Bourque, 2017-05-21 16:50:57

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 Calendar pour construire la date souhaitée et accéder à la représentation temporelle en tant que longue, par exemple avec la méthode getTimeInMillis .

 4
Author: Philipp, 2009-06-10 11:31:39

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());
 4
Author: Alex, 2009-06-10 14:02:02

Par souci d'exhaustivité, aussi une solution avec Joda-Time version 2.5 et ses DateTime classe:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
 1
Author: user152468, 2014-10-13 07:59:02

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, définissez-le simplement égal à new Date().

 -1
Author: CSquid, 2012-11-28 02:31:06