Je voudrais apporter la réponse moderne. Lorsque cette question a été posée en 2013, l'utilisation de la classe Timestamp
était correcte, par exemple pour stocker une date-heure dans votre base de données. Aujourd'hui, la classe est largement obsolète. L'API moderne Java date et heure est sortie avec Java 8 au printemps 2014, il y a trois ans et demi. Je vous recommande d'utiliser ceci à la place.
En fonction de votre situation et de vos besoins exacts, il existe deux remplacements naturels pour Timestamp
:
Instant
est un point sur la ligne de temps. Pour la plupart des usages, je considérerais que c'est le plus sûr à utiliser. Un Instant
est indépendant du fuseau horaire et fonctionnera généralement bien même dans des situations où votre appareil client et votre serveur de base de données sont dans des fuseaux horaires différents.
LocalDateTime
est une date et une heure de la journée sans fuseau horaire, comme 2011-10-02 18:48:05.123 (pour citer la question).
Un pilote JDBC moderne (JDBC 4.2 ou supérieur) et d'autres outils modernes pour l'accès aux bases de données seront ravis de stocker soit un Instant
soit un LocalDateTime
dans votre colonne de base de données de type timestamp
. Les deux classes et les autres classes date-heure que j'utilise dans cette réponse appartiennent à l'API moderne appelée java.time
ou JSR-310.
Il est le plus simple de convertir votre chaîne en LocalDateTime
, donc commençons par cela :
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
String text = "2011-10-02 18:48:05.123";
LocalDateTime dateTime = LocalDateTime.parse(text, formatter);
System.out.println(dateTime);
Cela affiche
2011-10-02T18:48:05.123
Si votre chaîne était au format yyyy-MM-dd, faites plutôt ceci :
String text = "2009-10-20";
LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
System.out.println(dateTime);
Cela affiche
2009-10-20T00:00
Ou encore mieux, prenez la sortie de LocalDate.parse()
et stockez-la dans une colonne de base de données de type date
.
Dans les deux cas, la procédure de conversion d'un LocalDateTime
en un Instant
est la suivante :
Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(ts);
J'ai spécifié une conversion en utilisant le fuseau horaire par défaut de la JVM car c'est ce que la classe obsolète aurait utilisé. Cependant, cela est fragile, car le paramétrage du fuseau horaire peut être modifié par d'autres parties de votre programme ou par d'autres programmes s'exécutant dans la même JVM. Si possible, spécifiez un fuseau horaire au format region/ville au lieu de cela, par exemple :
Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();