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

Hvordan gemmer man en java.util.Date i et MySQL-tidsstempelfelt i UTC/GMT-tidszonen?

Det korte svar er:

  • tilføj "default-time-zone=utc" til my.cnf
  • i din kode skal du altid "tænke" i UTC, undtagen når du viser datoer for dine brugere
  • når du henter/indstiller datoer eller tidsstempler med JDBC, skal du altid bruge kalenderparameteren, indstillet til UTC:

    resultset.getTimestamp("min_dato", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

  • Synkroniser enten dine servere med NTP, eller stol kun på, at databaseserveren fortæller dig, hvad klokken er.

Det lange svar er dette:

Når jeg beskæftiger mig med datoer og tidszoner i enhver database og med enhver klientkode, anbefaler jeg normalt følgende politik:

  1. Konfigurer din database til at bruge UTC-tidszone , i stedet for at bruge serverens lokale tidszone (medmindre det selvfølgelig er UTC).

    • Hvordan man gør det afhænger af din databaseserver. Instruktioner til MySQL kan findes her:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Grundlæggende skal du skrive dette i my.cnf:default-time-zone=utc

    • På denne måde kan du hoste dine databaseservere hvor som helst, nemt ændre din hostingplacering og mere generelt manipulere datoer på dine servere uden nogen tvetydighed.

    • Hvis du virkelig foretrækker at bruge en lokal tidszone, anbefaler jeg i det mindste at slå sommertid fra, fordi det kan være et rigtigt mareridt at have tvetydige datoer i din database.
      • For eksempel, hvis du bygger en telefonitjeneste, og du bruger sommertid på din databaseserver, beder du om problemer:der vil ikke være nogen måde at fortælle, om en kunde, der ringede fra "2008- 10-26 02:30:00" til "2008-10-26 02:35:00" kaldte faktisk i 5 minutter eller i 1 time og 5 minutter (hvis der var sommerferie den 26. oktober kl. 03.00)!
  2. Inde i din applikationskode skal du altid bruge UTC-datoer, undtagen når du viser datoer til dine brugere.

    • I Java skal du altid bruge:
    • , når du læser fra databasen

    Timestamp myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

    • Hvis du ikke gør dette, antages tidsstemplet at være i din lokale tidszone i stedet for UTC.
  3. Synkroniser dine servere eller stol kun på databaseserverens tid

    • Hvis du har din webserver på én server (eller flere) og din databaseserver på en anden server, så anbefaler jeg kraftigt, at du synkroniserer deres ure med NTP.

    • ELLER, stol kun på, at én server fortæller dig, hvad klokken er. Normalt er databaseserveren den bedste at bede om tid. Med andre ord, undgå kode som denne:

    readyStatement =connection.prepareStatement("OPDATERING min_tabel SET min_tid =? HVOR [...]");
    java.util.Dato nu =ny java.util.Date(); // lokal tid! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int result =readyStatement.execute();

    • I stedet skal du stole på databaseserverens tid:

    preparertStatement =forbindelse.prepareStatement("OPDATERING min_tabel INDSTIL min_tid =NU() HVOR [...]");
    int resultat =forberedtStatement.execute();

Håber dette hjælper! :-)



  1. VÆLG eller UDFØR i en PL/pgSQL-funktion

  2. PostgreSQL, VÆLG fra max id

  3. Brug af virtuelle felter i cakePHP 2.x

  4. Undtagelse 'kunne ikke finde driver' under migrering i yii2