Det korta svaret är:
- lägg till "default-time-zone=utc" till my.cnf
- i din kod, "tänk" alltid i UTC, förutom när du visar datum för dina användare
-
när du hämtar/ställer in datum eller tidsstämplar med JDBC, använd alltid parametern Kalender, inställd på UTC:
resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Antingen synkronisera dina servrar med NTP, eller lita bara på att databasservern berättar vad klockan är.
Det långa svaret är detta:
När jag hanterar datum och tidszoner i en databas och med eventuell klientkod rekommenderar jag vanligtvis följande policy:
-
Konfigurera din databas för att använda UTC-tidszon , istället för att använda serverns lokala tidszon (såvida det inte är UTC förstås).
-
Hur man gör det beror på din databasserver. Instruktioner för MySQL finns här:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . I grund och botten måste du skriva detta i my.cnf:default-time-zone=utc
-
På så sätt kan du vara värd för dina databasservrar var som helst, enkelt ändra din värdplats och mer allmänt manipulera datum på dina servrar utan tvetydighet.
- Om du verkligen föredrar att använda en lokal tidszon rekommenderar jag att du åtminstone stänger av sommartid, eftersom att ha tvetydiga datum i din databas kan vara en riktig mardröm.
- Till exempel, om du bygger en telefonitjänst och du använder sommartid på din databasserver så ber du om problem:det kommer inte att finnas något sätt att avgöra om en kund som ringde från "2008- 10-26 02:30:00" till "2008-10-26 02:35:00" ringde faktiskt i 5 minuter eller i 1 timme och 5 minuter (förutsatt att sommartid inträffade den 26 oktober kl. 03.00)!
-
-
Använd alltid UTC-datum i din applikationskod, förutom när du visar datum för dina användare.
- I Java, när du läser från databasen, använd alltid:
Timestamp myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Om du inte gör detta antas tidsstämpeln vara i din lokala tidszon istället för UTC.
-
Synkronisera dina servrar eller lita bara på databasserverns tid
-
Om du har din webbserver på en server (eller flera) och din databasserver på någon annan server, rekommenderar jag starkt att du synkroniserar deras klockor med NTP.
-
ELLER, lita bara på en server för att tala om för dig vad klockan är. Vanligtvis är databasservern den bästa att be om tid. Med andra ord, undvik kod som denna:
readyStatement =connection.prepareStatement("UPPDATERA min_tabell SETT min_tid =? WHERE [...]");
java.util.Date now =new java.util.Date(); // lokal tid! :-(
preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
int result =readyStatement.execute();- Lita istället på databasserverns tid:
prepareradeStatement =connection.prepareStatement("UPPDATERA min_tabell SETT min_tid =NU() WHERE [...]");
int resultat =prepareradeStatement.exekvera(); -
Hoppas det här hjälper! :-)