2017-07-25 3 views
2

Ich habe einen Zeitwert in meiner Datenbank in HH:mm:ss Format (mit MySQL time Typ) gespeichert. Diese Zeit ist als Wert der IST-Zeitzone zu betrachten. Der Server, auf dem mein Java-Code ausgeführt wird, folgt der UTC-Zeitzone.Konvertieren Sie die Datenbankzeit in IST Datetime

Wie kann ich eine formatierte Datetime in yyyy-MM-dd HH:mm:ss in IST (oder in UTC Millis) bekommen? Im Anschluss an dem, was ich bisher ausprobiert habe:

// ... Code truncated for brevity 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
LocalTime time = resultSet.getTime("send_time").toLocalTime(); 
LocalDateTime datetime = time.atDate(LocalDate.now()); 
System.out.println(datetime.format(formatter)); 

Die korrekt über die Datetime auf meinem lokalen Rechner druckt, die auf SIND ist, aber ich bin besorgt darüber, wie es auf dem Remote-Server verhält.

+2

Es gibt tatsächlich Antworten, aber es ist ein schlechter Link dafür, @deHaar. Der Fragesteller verwendet die moderne API für Datum und Uhrzeit korrekt und Sie verknüpfen eine Frage mit den veralteten Klassen. Benutze diese nicht. –

+1

Das ist richtig @ OleV.V., Verknüpfung gelöscht ... – deHaar

+1

Wenn Sie können, bevorzugen Sie "LocalTime Zeit = resultSet.getObject (" send_time ", LocalTime.class);'. Es benötigt einen neueren JDBC-Treiber (JDBC Version 4.2), aber ich glaube, dass MySQL so früh einen solchen Connector/J-out hatte, also haben Sie vielleicht Glück mit dem, was Sie haben. –

Antwort

4

Ihre Vorgehensweise ist in Ordnung und sollte unabhängig von der Zeitzone Ihres Computers funktionieren, da weder LocalTime noch LocalDateTime eine Zeitzoneninformation enthält. Ein mögliches Problem ist mit LocalDate.now(), das das heutige Datum in der lokalen Zeitzone des Computers zurückgibt, nicht in IST. Möglicherweise möchten Sie es durch LocalDate.now(ZoneId.of("Asia/Calcutta")) ersetzen.

Oder wie von @ OleV.V kommentiert. Sie können die neuen Treibereinrichtungen verwenden, um einen LocalTime direkt ableiten:

LocalTime time = resultSet.getObject("send_time", LocalTime.class); 

Hinweis möglichen Einsprüche mit Ihrem Ansatz:

  • , wenn die Zeitzone DST verwenden einführt, Sie mit zwei identischen Zeiten können am Ende in Ihrer DB, die eigentlich verschiedene Zeitpunkte waren - UTC zum Speichern Zeiten ist wahrscheinlich robuster
  • time in mysql kann Werte kleiner als 00:00 und größer als 23:59:59.999999, in diesem Fall können unerwartete Verhaltensweisen auf dem Java s auftreten ide.
+0

Vielen Dank für diese Antwort. Der Hauptteil war, "LocalDate" in der indischen Zeitzone zu bekommen, was jetzt gelöst ist. In den Notizen ist zuerst nicht auf mich anwendbar, weil die Zeit immer in IST sein wird. Für die zweite möchte ich mehr wissen. Könnten Sie bitte vorschlagen, alle Online-Materialien zu durchlaufen? – 31piy

+2

Ich schaute [The TIME Type] (https://dev.mysql.com/doc/refman/5.7/en/time.html) im MySQL-Referenzhandbuch. Vergleichen Sie mit ['LocalTime'] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html) in der Java-API-Dokumentation. Wenn Sie sicherstellen, dass die Zeit zwischen 00:00:00 und 23: 59: 59,999999 gespeichert wird, kann ich nicht glauben, dass Sie ein Problem sehen werden. –

+1

@ 31piy Beachten Sie auch, dass Sie Ihren Code testen können, indem Sie Ihre JVM-Zeitzone mit 'TimeZone.setDefault (zone);' ändern. Idealerweise sollten Sie die Änderung vor dem Laden des mysql-Treibers vornehmen und die Verbindung öffnen, um sicherzustellen, dass sie berücksichtigt wird. – assylias

Verwandte Themen