Ist java.sql.Timestamp timezone spezifischen?
Habe ich zum speichern UTC-dateTime in der DB.
Ich habe konvertiert, die dateTime -, die in bestimmten Zeitzone zu UTC. dafür folgte ich dem code unten.
Mein input dateTime "20121225 10:00:00 Z" Zeitzone "Asia/Calcutta"
Mein Server/DB(oracle) läuft in der gleichen Zeitzone(MEZ) "Asia/Calcutta"
Bekommen das Date-Objekt in diesem bestimmten Zeitzone
String date = "20121225 10:00:00 Z";
String timeZoneId = "Asia/Calcutta";
TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
DateFormat dateFormatLocal = new SimpleDateFormat("yyyyMMdd HH:mm:ss z");
//This date object is given time and given timezone
java.util.Date parsedDate = dateFormatLocal.parse(date + " "
+ timeZone.getDisplayName(false, TimeZone.SHORT));
if (timeZone.inDaylightTime(parsedDate)) {
//We need to re-parse because we don't know if the date
//is DST until it is parsed...
parsedDate = dateFormatLocal.parse(date + " "
+ timeZone.getDisplayName(true, TimeZone.SHORT));
}
//assigning to the java.sql.TimeStamp instace variable
obj.setTsSchedStartTime(new java.sql.Timestamp(parsedDate.getTime()));
Speichern in die DB
if (tsSchedStartTime != null) {
stmt.setTimestamp(11, tsSchedStartTime);
} else {
stmt.setNull(11, java.sql.Types.DATE);
}
AUSGABE
DB (oracle) gespeichert hat, die gleichen dateTime: "20121225 10:00:00
nicht in UTC.
Ich bestätigt haben von der folgenden sql -.
select to_char(sched_start_time, 'yyyy/mm/dd hh24:mi:ss') from myTable
Mein DB-server läuft auch auf der gleichen Zeitzone "Asia/Calcutta"
Es gibt mir die unten Auftritte
Date.getTime()
ist nicht in UTC- Oder Timestamp hat, Zeitzone Auswirkungen beim speichern in die DB
Was mache ich hier falsch?
Noch eine Frage:
Wird timeStamp.toString()
drucken im lokalen Zeitzone wie java.util.date
? Nicht UTC?
Le Blanc Dank!. Könnten Sie bitte mir Antworten, "new java.sql.Timestamp(parsedDate.getTime())" zurückkehren wird, GMT-timestamp-Objekt für meine Mitarbeit?
Obwohl
java.sql.Timestamp
ist in UTC, bei der Speicherung in ein TIMESTAMP-Feld ohne Zeitzone-information es nutzt die äquivalente Datum/Uhrzeit in der aktuellen Zeitzone der virtuellen MaschineSugumar: Ja. die getTime-Methode des Date-Klasse gibt die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT.
Daneben habe ich nicht bekommen, Ihren Punkt "speichern in ein TIMESTAMP-Feld ohne Zeitzone-information es nutzt die äquivalente Datum/Uhrzeit in der aktuellen Zeitzone der virtuellen Maschine". Könnten Sie bitte erläutern Sie Ihre Antwort. Es werden mehr hilfreich für mich.
InformationsquelleAutor Kanagavelu Sugumar | 2012-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl es nicht explizit angegeben ist für
setTimestamp(int parameterIndex, Timestamp x)
Treiber haben, befolgen Sie die Regeln, die durch diesetTimestamp(int parameterIndex, Timestamp, x, Calendar cal)
javadoc:Beim Aufruf mit
setTimestamp(int parameterIndex, Timestamp x)
den JDBC-Treiber verwendet die Zeitzone der virtuellen Maschine zu berechnen, das Datum und die Uhrzeit des Zeitstempels in dieser Zeitzone. Das Datum und die Zeit ist das, was in der Datenbank gespeichert ist, und wenn die Spalte in der Datenbank nicht speichern, Zeitzonen-Informationen, dann werden alle Informationen über die zone verloren geht (was bedeutet, es ist bis zu der Anwendung(en) unter Verwendung der Datenbank Verwendung der gleichen Zeitzone konsequent oder kommen mit einem anderen Schema zu erkennen timezone (dh speichern Sie in einer separaten Spalte).Beispiel: Ihre lokale Zeitzone ist GMT+2. Speichern Sie "2012-12-25 10:00:00 UTC". Der tatsächliche Wert in der Datenbank gespeichert ist "2012-12-25 12:00:00". Rufen Sie es wieder: Sie Holen es wieder als "2012-12-25 10:00:00 UTC" (aber nur, wenn Sie es abrufen mit
getTimestamp(..)
), aber wenn eine andere Anwendung greift auf die Datenbank in der Zeitzone GMT+0, abrufen den Zeitstempel als "2012-12-25 12:00:00 UTC".Wenn Sie möchten, speichern Sie es in einer anderen Zeitzone, dann müssen Sie die
setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
mit einem Kalender-Instanz in der gewünschten Zeitzone. Nur stellen Sie sicher, dass Sie auch die entsprechende getter-mit der gleichen Zeit-zone beim abrufen der Werte (wenn SieTIMESTAMP
ohne Zeitzone Informationen in Ihrer Datenbank).So, angenommen, Sie möchten, speichern Sie die aktuelle GMT-Zeitzone, die Sie verwenden müssen:
Mit 4.2 JDBC-konforme Treiber unterstützen sollte
java.time.LocalDateTime
(undjava.time.LocalTime
) fürTIMESTAMP
(undTIME
) durchget/set/updateObject
. Diejava.time.Local*
Klassen sind ohne Zeit Zonen, so dass keine Konvertierung angewendet werden muss (obwohl, dass könnte einen neuen Satz von Problemen, wenn Ihr code hast, davon ausgehen, ein bestimmtes Zeit-zone).siehe mein update
Das ist der aktuelle timestamp-Wert festgelegt. Ein Treiber verwendet nur die Calendar-Objekt für die Zeitzone Informationen, nicht nach seinem Wert!
Super, Es funktioniert 🙂 ich verbringe viel Zeit zu beweisen (Date/Timestamp).getTime() ist holding Zeitzone bestimmte Zeit in Millisekunden. Jetzt habe ich verstanden, dass Es nicht ist. Es gebe immer UTC Millisekunden unabhängig von der Zeitzone. Aber (Date/Timestamp).toString() ist die Zeitzone bestimmte. Vielen Dank.
Die
toString()
aufjava.lang.Date
(undjava.lang.Timestamp
) wird immer in Ihrer lokalen Zeitzone.InformationsquelleAutor Mark Rotteveel
Ich denke, die richtige Antwort sollte sein java.sql.Timestamp ist NICHT timezone bestimmten. Timestamp ist ein Verbund von java.util.Datum und eine separate Nanosekunden-Wert. Es gibt keine Zeitzone Informationen in dieser Klasse. Also nur als Datum, an dem diese Klasse einfach enthält die Anzahl der Millisekunden seit dem 1. Januar 1970, 00:00:00 GMT + nanos.
In PreparedStatement.setTimestamp(int parameterIndex, Timestamp, x, Calendar cal)
Kalender ist von dem Treiber verwendet wird, ändern Sie die Standard-Zeitzone. Aber Timestamp hält immer noch Millisekunden in GMT.
API ist unklar, wie genau JDBC-Treiber verwenden soll-Kalender. Die Anbieter scheinen sich frei zu fühlen, darüber, wie diese zu interpretieren sind, z.B. letzter Zeit arbeitete ich mit MySQL 5.5 Kalender der Fahrer einfach ignoriert Kalender in PreparedStatement.setTimestamp und ResultSet.getTimestamp.
Ich glaube, dass dies falsch ist, wie von java 8+. Innerhalb der Timestamp (denn es erstreckt sich von java.util.Datum) gibt es eine Kalender-Attribut, die eine zoneinfo-Attribut, das in der Tat enthält der Zeitzone. Sie können immer noch UTC-Zeit mit .getTime() verwenden, da der Timestamp speichert auch, aber es HAT Zeitzoneninformationen.
InformationsquelleAutor Evgeniy Dorofeev
Es ist das spezifische von Ihrem Fahrer. Sie brauchen, um einen parameter zu liefern, die in Ihrem Java-Programm zu sagen, die Zeitzone, die Sie verwenden möchten.
Weiter:
Kann auch von Wert sein im Umgang mit der Umwandlung einwandfrei. Entnommen aus hier
auch das hängt davon ab. Wenn Sie möchten, ändern Sie die Zeitstempel für JEDE Abfrage auf Start, wenn Sie nur ändern wollen (also etwas weniger als JEDER) ändern Sie dann die einzelnen Abfragen in der Mode-wie dargelegt hat die post, die Sie referenziert.
InformationsquelleAutor Woot4Moo
Für Mysql, haben wir eine Einschränkung.
In der Treiber Mysql-doc haben wir :
So, wenn wir nicht verwenden, diese Parameter und wir nennen
setTimestamp or getTimestamp
mit Kalender oder ohne Kalender haben wir den timestamp in der jvm-Zeitzone.Beispiel :
Der jvm-Zeitzone ist GMT+2.
In der Datenbank, wir haben einen timestamp : 1461100256 = 19/04/16 21:10:56,000000000 GMT
Die erste Methode gibt : 1461100256000 = 19/04/2016 - 21:10:56 GMT
Die zweite Methode gibt : 1461100256000 = 19/04/2016 - 21:10:56 GMT
Die Dritte Methode gibt : 1461085856000 = 19/04/2016 - 17:10:56 GMT
Anstelle von Oracle, wenn wir die gleichen Aufrufe, die wir haben :
Die erste Methode gibt : 1461093056000 = 19/04/2016 - 19:10:56 GMT
Die zweite Methode gibt : 1461100256000 = 19/04/2016 - 21:10:56 GMT
Die Dritte Methode gibt : 1461085856000 = 19/04/2016 - 17:10:56 GMT
NB :
Es ist nicht notwendig, geben Sie die Parameter für Oracle.
ALTER SESSION SET TIME_ZONE = 'UTC'
".InformationsquelleAutor Abdelhafid