Ich möchte die moderne Antwort beitragen. Als diese Frage 2013 gestellt wurde, war die Verwendung der Timestamp
Klasse richtig, beispielsweise zum Speichern einer Datums- und Uhrzeitangabe in Ihrer Datenbank. Heute ist die Klasse längst veraltet. Die moderne Java-API für Datum und Uhrzeit wurde im Frühjahr 2014, vor dreieinhalb Jahren, mit Java 8 herausgebracht. Ich empfehle Ihnen, dies stattdessen zu verwenden.
Abhängig von Ihrer Situation und den genauen Anforderungen gibt es zwei natürliche Ersetzungen für Timestamp
:
Instant
ist ein Punkt auf der Zeitachse. Für die meisten Zwecke würde ich es als am sichersten betrachten, dies zu verwenden. Ein Instant
ist unabhängig von der Zeitzone und funktioniert normalerweise auch in Situationen, in denen Ihr Clientgerät und Ihr Datenbankserver unterschiedliche Zeitzonen ausführen.
LocalDateTime
ist ein Datum und eine Uhrzeit ohne Zeitzone, wie 2011-10-02 18: 48: 05.123 (um die Frage zu zitieren).
Ein moderner JDBC-Treiber (JDBC 4.2 oder höher) und andere moderne Tools für den Datenbankzugriff speichern gerne entweder einen Instant
oder einen LocalDateTime
in Ihrer Datenbankspalte des Datentyps timestamp
. Beide Klassen und die anderen Datums- / Uhrzeitklassen, die ich in dieser Antwort verwende, gehören zur modernen API java.time
JSR-310.
Es ist am einfachsten, Ihre Zeichenfolge in zu konvertieren. LocalDateTime
Nehmen wir das zuerst:
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);
Dies wird gedruckt
2011-10-02T18:48:05.123
Wenn Ihre Zeichenfolge im Format JJJJ-MM-TT vorliegt, gehen Sie stattdessen wie folgt vor:
String text = "2009-10-20";
LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
System.out.println(dateTime);
Dies wird gedruckt
2009-10-20T00:00
Oder noch besser, nehmen Sie die Ausgabe von LocalDate.parse()
und speichern Sie sie in einer Datenbankspalte vom Datentyp date
.
In beiden Fällen lautet das Verfahren zum Konvertieren von a LocalDateTime
nach a Instant
:
Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(ts);
Ich habe eine Konvertierung unter Verwendung der Standardzeitzone der JVM angegeben, da dies die veraltete Klasse verwendet hätte. Dies ist jedoch fragil, da die Zeitzoneneinstellung unter unseren Füßen durch andere Teile Ihres Programms oder durch andere Programme, die in derselben JVM ausgeführt werden, geändert werden kann. Wenn Sie können, geben Sie stattdessen eine Zeitzone im Format Region / Stadt an , zum Beispiel:
Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();