2016-06-17 4 views
6

Ich habe eine Timestamp-Spalte in Oracle-Tabelle. Während der Speicherung speichere ich es in UTC in dieser Spalte. Zum Abrufen dieses Zeitstempels verwende ich Spring's JdbcTemplate, während das Objekt vom Typ TimeStamp zurückgegeben wird.Wie Oracle-Timestamp-Spalte in der erwarteten Zeitzone in Java abrufen?

Ich möchte Datum Zeit Zeichenfolge im Format "TT-MM-YYYY HH: mm: ss" in der aktuellen Zeitzone erhalten. Um zu erreichen, dass ich folgenden Code versuchen:

new LocalDateTime(<retrieved TimeStamp>, <current user DateTimeZone>).toString("yyyy-MM-dd HH:mm:ss") 

Sowohl Local und DateTimeZone von Joda Bibliothek.

Wie funktioniert das nicht wie erwartet. Anstelle der aktuellen Zeitzone des aktuellen Benutzers gibt mir die Datumszeit nur in UTC an.

Was fehlt mir?

+0

Was die vollständig qualifizierten Klassennamen ist für die Local Sie hier sind instanziieren? Ich kann keine Dokumentation finden, die Ihrer Arbeit ähnelt. –

+0

Mein schlechtes. In der Beschreibung aktualisiert. Es ist von Joda Bibliothek. –

Antwort

2

hinzufügen utc Kalender, wenn der Zeitstempel aus der Datenbank zu holen, so dass der JDBC-Treiber diesen Kalender Zeitzone statt Standardsystemzeitzone verwenden können.

//Assign utc calendar 
Calendar utc= Calendar.getInstance(); 
utc.setTimeZone(TimeZone.getTimeZone("UTC")); 
Timestamp timestamp = rs.getTimestamp("timestampcolumn", utc); 
//Convert to client date time 
DateTime dateTime = new DateTime(timestamp.getTime(), DateTimeZone.forID("Asia/Kolkata")); 
//Format 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
//Change to client wall clock time 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime) 

Beispiel

String utcTime = "2016-06-17 14:22:02Z"; 
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ"); 
DateTime dateTime = parser.parseDateTime(utcTime).withZone(DateTimeZone.forID("Asia/Kolkata")); 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
System.out.println(dateTime); 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime); 
System.out.println(formattedlocalDateTime); 
+0

Gibt dieser Ansatz Ihnen Datum in der richtigen Zeitzone? Ich habe das versucht und ich habe immer noch das Problem. –

+0

Aktualisierte Antwort mit Beispiel. Sie können Ihre Werte eingeben und sehen, ob es für Sie funktioniert, – Veeram

+0

Für den gleichen Code bekomme ich folgende Werte auf meinem Rechner: timestamp: 2016-06-17 09: 33: 25.0, datetime: 2016-06-17T09: 33: 25.000 + 05: 30, localDateTime: 2016-06-17T09: 33: 25.000, formatter.print (localDateTime): 17-06-2016 09:33:25. Ich habe "Asien/Kolkata" als Zeitzone verwendet. –

4

Ich denke, Ihre Anwendung verwendet java.util.Date, die keine Zeitzone Informationen enthält, die toString Verwendung gilt die aktuelle Standard-Zeitzone der JVM beim Erstellen einer Zeichenfolge.

Sie können die Zeitzone sofort anpassen, indem (Using Joda Library)

ZonedDateTime Tokyo = ZonedDateTime.ofInstant (instant,zoneIdTokyo) ; 

Oder implementieren Zonen

DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo"); 

Sie verwenden LocalDateTime die unveränderliche Klasse ist die eine lokale Datum und Uhrzeit (keine Zeit Zone)

EDIT - Sie können diesversuchen(ich habe es nicht getestet)

DateTime udate = new DateTime("2016-05-01T20:10:04", DateTimeZone.UTC); 
System.out.println(udate); 
DateTime zone = udate.plusMillis(10000) 
.withZone(DateTimeZone.forID("Asia/Kolkata")); 
System.out.println(zone); 
+0

Ich wäre sehr dankbar, wenn Sie ein kleines Code-Snippet bereitstellen könnten, das Timestamp-Objekt in eine formatierte Zeichenfolge umwandelt. –

Verwandte Themen