Krótka odpowiedź brzmi:
- dodaj „default-time-zone=utc” do my.cnf
- w swoim kodzie zawsze „myśl” w UTC, z wyjątkiem wyświetlania dat dla użytkowników
-
podczas pobierania/ustawiania dat lub znaczników czasu za pomocą JDBC zawsze używaj parametru Calendar, ustawionego na UTC:
resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- albo zsynchronizuj swoje serwery z NTP, albo polegaj tylko na serwerze bazy danych, który powie Ci, która jest godzina.
Długa odpowiedź brzmi:
Mając do czynienia z datami i strefami czasowymi w dowolnej bazie danych oraz z dowolnym kodem klienta, zazwyczaj zalecam następującą politykę:
-
Skonfiguruj bazę danych tak, aby korzystała ze strefy czasowej UTC , zamiast używać lokalnej strefy czasowej serwera (oczywiście chyba że jest to UTC).
-
Sposób wykonania zależy od serwera bazy danych. Instrukcje dotyczące MySQL można znaleźć tutaj:http:// /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Zasadniczo musisz napisać to w my.cnf:default-time-zone=utc
-
W ten sposób możesz hostować swoje serwery baz danych w dowolnym miejscu, łatwo zmieniać lokalizację hostingu i ogólniej manipulować datami na swoich serwerach bez żadnych niejasności.
- Jeśli naprawdę wolisz używać lokalnej strefy czasowej, polecam przynajmniej wyłączenie czasu letniego, ponieważ niejednoznaczne daty w bazie danych mogą być prawdziwym koszmarem.
- Na przykład, jeśli budujesz usługę telefoniczną i korzystasz z czasu letniego na serwerze bazy danych, prosisz o kłopoty:nie będzie sposobu, aby stwierdzić, czy klient, który dzwonił od „2008- 10-26 02:30:00” do „2008-10-26 02:35:00” faktycznie dzwonił przez 5 minut lub przez 1 godzinę i 5 minut (przypuśćmy, że czas letni miał miejsce 26 października o 3 nad ranem)!
-
-
W kodzie aplikacji zawsze używaj dat UTC, z wyjątkiem sytuacji, gdy wyświetlasz daty użytkownikom.
- W Javie podczas odczytu z bazy danych zawsze używaj:
Znacznik czasu mojaData =resultSet.getTimestamp("moja_data", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Jeśli tego nie zrobisz, zakłada się, że znacznik czasu znajduje się w Twojej lokalnej Strefie Czasowej, a nie UTC.
-
Synchronizuj swoje serwery lub polegaj tylko na czasie serwera bazy danych
-
Jeśli masz serwer WWW na jednym serwerze (lub więcej), a serwer bazy danych na innym serwerze, zdecydowanie zalecamy synchronizację ich zegarów z NTP.
-
LUB polegaj tylko na jednym serwerze, aby poinformować Cię, która jest godzina. Zwykle serwer bazy danych najlepiej pyta o czas. Innymi słowy, unikaj kodu takiego jak ten:
readyStatement =connection.prepareStatement("UPDATE moja_tabela SET mój_czas =? GDZIE [...]");
java.util.Date now =new java.util.Date(); // czas lokalny! :-(
preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
int wynik =przygotowanyStatement.execute();- Zamiast tego polegaj na czasie serwera bazy danych:
PrepareStatement =connection.prepareStatement("UPDATE moja_tabela SET mój_czas =TERAZ() GDZIE [...]");
int wynik =Preparement.execute(); -
Mam nadzieję że to pomoże! :-)