Antworten:
Mit Timestamp
, ich nehme an, du meinst java.sql.Timestamp
. Sie werden feststellen, dass diese Klasse einen Konstruktor hat, der ein long
Argument akzeptiert . Sie können dies mit der DateFormat
Klasse analysieren :
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
und java.text.SimpleDateFormat
sind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Was ist damit?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Was meinst du mit Zeitstempel? Wenn Sie Millisekunden seit der Unix-Epoche meinen:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Wenn Sie ein aktuelles java.sql.Timestamp-Objekt möchten:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Aktualisieren wir diese Seite, indem wir Code mit dem in Java 8 und höher integrierten java.time- Framework anzeigen .
Diese neuen Klassen sind von Joda-Time inspiriert , definiert durch JSR 310 und erweitert durch das ThreeTen-Extra- Projekt. Sie ersetzen die notorisch lästigen alten Datums- und Uhrzeitklassen, die mit frühen Java-Versionen gebündelt sind.
In java.time Instant
ist ein Moment auf der Timeline in UTC. A ZonedDateTime
ist ein Moment, der in eine Zeitzone ( ZoneId
) eingestellt ist.
Die Zeitzone ist hier entscheidend. Ein Datum von September 23, 2007
kann nicht in einen Moment auf der Zeitachse übersetzt werden, ohne eine Zeitzone anzuwenden. Bedenken Sie, dass in Paris früher ein neuer Tag beginnt als in Montréal, wo es noch „gestern“ ist.
Außerdem repräsentiert ein java.sql.Timestamp sowohl ein Datum als auch eine Uhrzeit. Wir müssen also eine Tageszeit angeben, die dem Datum entspricht. Wir gehen davon aus, dass Sie den ersten Moment des Tages als Tageszeit wünschen. Beachten Sie, dass dies 00:00:00.0
aufgrund der Sommerzeit und möglicherweise anderer Anomalien nicht immer die richtige Zeit ist.
Beachten Sie, dass die java.time-Typen im Gegensatz zur alten Klasse java.util.Date und im Gegensatz zu Joda-Time eine Auflösung von Nanosekunden anstelle von Millisekunden haben. Dies entspricht der Auflösung von java.sql.Timestamp.
Beachten Sie, dass der java.sql.Timestamp die unangenehme Angewohnheit hat, die aktuelle Standardzeitzone Ihrer JVM implizit auf ihren Datums- / Uhrzeitwert anzuwenden, wenn eine Zeichenfolgendarstellung über ihre toString
Methode generiert wird. Hier sehen Sie meine America/Los_Angeles
Zeitzone angewendet. Im Gegensatz dazu sind die java.time-Klassen mit den Standardformaten ISO 8601 vernünftiger .
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 zur Konsole.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Beim Ausführen.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Amerika / Montreal] = sofort: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
Ab JDBC 4.2 können Sie übrigens die Typen java.time direkt verwenden. Keine Notwendigkeit für java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*
Klassen.
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .
Sie können auch Folgendes tun:
// 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());
Laut API ist der Konstruktor, der Jahr, Monat usw. akzeptiert, veraltet. Stattdessen sollten Sie den Konstruktor verwenden, der eine lange akzeptiert. Sie können eine Kalenderimplementierung verwenden , um das gewünschte Datum zu erstellen und auf die Zeitdarstellung als Long zuzugreifen, beispielsweise mit der Methode getTimeInMillis .
Der Vollständigkeit halber auch eine Lösung mit Joda-Time Version 2.5 und seiner DateTime
Klasse:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
Objekt angewendet . Das bedeutet, dass Ihre Ergebnisse auf verschiedenen Computern oder in der Konfiguration des Host-Betriebssystems oder der JVM-Einstellungen variieren . Übergeben Sie für vorhersagbare Ergebnisse eine Zeitzone an diesen DateTime
Konstruktor. Wählen Sie den richtigen Zeitzonennamen für Ihre Absicht. Zum Beispiel DateTimeZone.forID( "America/Montreal" )
oder DateTimeZone.UTC
.
DateTime
Objekt einfach nach seiner Millisekunden seit der Epoche. Ersetzen .toDate().getTime()
durch .getMillis()
.
DateTimeZone.getDefault()
indem Sie das Ergebnis aufrufen und als optionales Argument übergeben. (Übrigens auch für das Locale.getDefault()
gleiche Problem über die Mehrdeutigkeit optionaler Argumente.)
Eine allgemeinere Antwort wäre der Import java.util.Date
. Wenn Sie dann ein timestamp
gleiches Datum festlegen müssen, setzen Sie es einfach gleich new Date()
.