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:
-
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)!
-
-
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.
-
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! :-)