Z instrukcji ( rozdział 9.6 ):
Bieżące wartości globalnych i specyficznych dla klienta stref czasowych można pobrać w następujący sposób:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Edytuj Powyższe zwraca, SYSTEM
jeśli MySQL jest ustawiony jako slave w strefie czasowej systemu, co jest mniej niż pomocne. Ponieważ używasz PHP, jeśli odpowiedź na MySQL brzmi SYSTEM
, możesz zapytać system , za pomocą której strefy czasowej używa date_default_timezone_get
. (Oczywiście, jak VolkerK wskazał, PHP może być uruchomiony na innym serwerze, ale założenia iść, przy założeniu, że serwer WWW i serwer DB to rozmawiasz są ustawione na [jeśli nie faktycznie w ] ta sama strefa czasowa nie jest ogromny skok.) Ale uwaga: tak jak w przypadku MySQL, możesz ustawić strefę czasową używaną przez PHP (date_default_timezone_set
), co oznacza, że może zgłaszać inną wartość niż system operacyjny. Jeśli masz kontrolę nad kodem PHP, powinieneś wiedzieć, czy to robisz i być w porządku.
Ale całe pytanie o strefę czasową, z której korzysta serwer MySQL, może być styczną, ponieważ pytanie serwera o strefę czasową nie mówi absolutnie nic o danych w bazie danych. Czytaj dalej, aby uzyskać szczegółowe informacje:
Dalsza dyskusja :
Jeśli kontrolujesz serwer, możesz oczywiście upewnić się, że strefa czasowa jest znaną ilością. Jeśli nie kontrolujesz serwera, możesz ustawić strefę czasową używaną przez twoje połączenie w następujący sposób:
set time_zone = '+00:00';
To ustawia strefę czasową na GMT, aby wszelkie dalsze operacje (jak now()
) wykorzystywały GMT.
Należy jednak pamiętać, że wartości czasu i daty nie są przechowywane z informacjami o strefie czasowej w MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Więc wiedząc strefę czasową serwera jest ważna tylko pod względem funkcji, które uzyskać czas teraz, takie jak now()
, unix_timestamp()
itp .; nie mówi nic o strefie czasowej, której używają daty w danych bazy danych. Możesz założyć, że zostały napisane w strefie czasowej serwera, ale założenie to może być błędne. Aby poznać strefę czasową dowolnych dat lub godzin przechowywanych w danych, musisz upewnić się, że są one przechowywane wraz z informacjami o strefie czasowej lub (tak jak ja), aby zawsze znajdowały się w GMT.
Dlaczego założenie, że dane zostały zapisane przy użyciu strefy czasowej serwera, jest wadliwe? Po pierwsze, dane mogły zostać zapisane przy użyciu połączenia, które ustawiło inną strefę czasową. Baza danych mogła zostać przeniesiona z jednego serwera na inny, gdzie serwery znajdowały się w różnych strefach czasowych (wpadłem na to, kiedy odziedziczyłem bazę danych, która przeniosła się z Teksasu do Kalifornii). Ale nawet jeśli dane są zapisywane na serwerze wraz z bieżącą strefą czasową, nadal są niejednoznaczne. W ubiegłym roku, w Stanach Zjednoczonych, czas letni został wyłączony o 2:00 1 listopada. Załóżmy, że mój serwer znajduje się w Kalifornii i korzysta ze strefy czasowej Pacyfiku, a ja mam wartość2009-11-01 01:30:00
w bazie danych. Kiedy to było? Czy to 1:30 PDT 1 listopada, czy 1:30 PST 1 listopada (godzina później)? Nie masz absolutnie żadnej możliwości poznania. Morał: zawsze przechowuj daty / godziny w GMT (który nie robi czasu letniego) i konwertuj do żądanej strefy czasowej w razie potrzeby.