sql >> Database teknologi >  >> RDS >> Mysql

Java MySQL Timestamp tidszone problemer

Jordan, faktisk havde du den rigtige idé. Problemet er, at der er en fejl i MySQL JDBC-driveren, og kalenderargumentet ignoreres fuldstændigt som standard. Se på kildekoden til PreparedStatement for virkelig at se, hvad der foregår.

Bemærk, at formatet er tidsstemplet ved hjælp af JVM's tidszone. Dette vil kun fungere, hvis din JVM bruger UTC tidszone. Kalender-objektet ignoreres fuldstændigt.

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

For at MySQL kan bruge kalenderargumentet, skal du deaktivere den gamle dato/tidskode med følgende forbindelsesmulighed:

useLegacyDatetimeCode=false

Så du kan bruge det, når du opretter forbindelse til databasen på denne måde:

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

Hvis du deaktiverer den gamle datetime-kode ved hjælp af ovenstående linje, VIL den gengive dit tidsstempel i målkalenderens tidszone:

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);
}

Det er ret nemt at se, hvad der foregår her. Hvis du sender et kalenderobjekt ind, vil det bruge dette ved formatering af dataene. Ellers vil den bruge databasens tidszone til at formatere dataene. Mærkeligt nok, hvis du passerer i en kalender, vil den også indstille tiden til den givne tidsstempelværdi (hvilket ser ud til at være meningsløst).



  1. MySQL - vælg data fra databasen mellem to datoer

  2. Kan ikke indstille small_case_table_names i MySQL 8.x på Windows 10

  3. Sådan fungerer INSTR() i MariaDB

  4. MySQL-datoforskel