sql >> Database >  >> RDS >> Mysql

Problemen met de tijdzone van Java MySQL Tijdstempel

Jordan, eigenlijk had je het juiste idee. Het probleem is dat er een fout zit in het MySQL JDBC-stuurprogramma en dat het argument Calendar standaard volledig wordt genegeerd. Bekijk de broncode van PreparedStatement om echt te zien wat er aan de hand is.

Merk op dat het de tijdstempel is met de tijdzone van de JVM. Dit werkt alleen als uw JVM de UTC-tijdzone gebruikt. Het Agenda-object wordt volledig genegeerd.

this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss''", Locale.US);
timestampString = this.tsdf.format(x);

Om ervoor te zorgen dat MySQL het argument Kalender gebruikt, moet u de oude datum-/tijdcode uitschakelen met de volgende verbindingsoptie:

useLegacyDatetimeCode=false

U kunt het dus gebruiken als u op de volgende manier verbinding maakt met de database:

String url = "jdbc:mysql://localhost/tz?useLegacyDatetimeCode=false"

Als u de verouderde datetime-code uitschakelt met behulp van de bovenstaande regel, wordt uw tijdstempel in de tijdzone van de doelagenda weergegeven:

if (targetCalendar != null) {
    targetCalendar.setTime(x);
    this.tsdf.setTimeZone(targetCalendar.getTimeZone());

     timestampString = this.tsdf.format(x);
} else {
    this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
    timestampString = this.tsdf.format(x);
}

Het is vrij eenvoudig om te zien wat hier aan de hand is. Als u een kalenderobject doorgeeft, zal het dit gebruiken bij het opmaken van de gegevens. Anders wordt de tijdzone van de database gebruikt om de gegevens op te maken. Vreemd genoeg, als je een kalender doorgeeft, wordt de tijd ook ingesteld op de opgegeven tijdstempelwaarde (wat zinloos lijkt).



  1. Essentiële PostgreSQL-bewaking - Deel 3

  2. INSERT INTO Tabel uit meerdere tabellen

  3. Hoe de taakresultaten van het SSIS-pakket controleren nadat de uitvoering ervan is voltooid?

  4. Willekeurige sortering van SQL Server