sql >> Databasteknik >  >> RDS >> Mysql

Java MySQL Tidsstämpel tidszon problem

Jordan, du hade faktiskt rätt idé. Problemet är att det finns en bugg i MySQL JDBC-drivrutinen och kalenderargumentet ignoreras helt som standard. Titta på källkoden för PreparedStatement för att verkligen se vad som händer.

Lägg märke till att formatet är tidsstämpeln som använder JVM:s tidszon. Detta fungerar bara om din JVM använder UTC-tidszon. Kalenderobjektet ignoreras helt.

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

För att MySQL ska kunna använda kalenderargumentet måste du inaktivera den äldre datum-/tidskoden med följande anslutningsalternativ:

useLegacyDatetimeCode=false

Så du kan använda det när du ansluter till databasen så här:

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

Om du inaktiverar den äldre datetime-koden med hjälp av raden ovan, KOMMER den att återge din tidsstämpel i målkalenderns tidszon:

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 är ganska lätt att se vad som händer här. Om du skickar in ett kalenderobjekt kommer det att använda detta vid formatering av data. Annars kommer den att använda databasens tidszon för att formatera data. Konstigt nog, om du passerar i en kalender kommer den också att ställa in tiden till det givna tidsstämpelvärdet (vilket verkar vara meningslöst).



  1. Ska jag använda backticks eller inte när jag undslipper sökord i MySQL?

  2. MS-Access Class Module och VBA

  3. Geolokalisering SQL-fråga hittar inte exakt plats

  4. Byt namn på kolumn SQL Server 2008