Dalsze pytanie dotyczące /server/191331/should-servers-have-their-timezone-set-to-gmt-utc
Czy strefa czasowa MySQL powinna być ustawiona na UTC, czy też powinna być ustawiona na tę samą strefę czasową, co serwer lub PHP? (Jeśli nie jest to UTC)
Jakie są wady i zalety?
Odpowiedzi:
Wydaje się, że nie ma znaczenia, która strefa czasowa znajduje się na serwerze, o ile masz ustawiony czas dla bieżącej strefy czasowej, znasz strefę czasową kolumn z datą i godziną, które przechowujesz, i jesteś świadomy problemów z czasem letnim.
Z drugiej strony, jeśli masz kontrolę nad strefami czasowymi serwerów, z którymi pracujesz, możesz ustawić wszystko wewnętrznie na UTC i nigdy nie martwić się o strefy czasowe i czas letni.
Oto kilka uwag, które zebrałem, jak pracować ze strefami czasowymi jako formą ściągawki dla siebie i innych, które mogą mieć wpływ na to, jaką strefę czasową dana osoba wybierze dla swojego serwera i jak będzie przechowywać datę i godzinę.
Ściągawka dotycząca strefy czasowej MySQL
Uwagi:
GMT myli sekundy, dlatego wynaleziono UTC.
Ostrzeżenie! różne regionalne strefy czasowe mogą generować tę samą wartość daty i godziny ze względu na czas letni
Wewnętrznie kolumna sygnatury czasowej MySQL jest przechowywana jako UTC, ale po wybraniu daty MySQL automatycznie przekonwertuje ją na strefę czasową bieżącej sesji.
Przechowując datę w znaczniku czasowym, MySQL przyjmie, że data jest w strefie czasowej bieżącej sesji i przekonwertuje ją na czas UTC w celu przechowywania.
Aby wybrać kolumnę znacznika czasu w formacie UTC
bez względu na strefę czasową, w której znajduje się bieżąca sesja MySQL:
Możesz również ustawić serwer lub strefę czasową globalną lub bieżącą sesji na UTC, a następnie wybrać sygnaturę czasową w następujący sposób:
Aby wybrać bieżącą datę i godzinę w UTC:
Przykładowy wynik:
2015-03-24 17:02:41
Aby wybrać bieżącą datę i godzinę w strefie czasowej sesji
Aby wybrać strefę czasową, która została ustawiona podczas uruchamiania serwera
Zwraca „MSK” lub „+04: 00” dla czasu moskiewskiego, na przykład wystąpił (lub był) błąd MySQL, który powodował, że ustawienie przesunięcia liczbowego nie powodowało dostosowania czasu letniego
Aby uzyskać aktualną strefę czasową
Zwróci 02:00:00, jeśli Twoja strefa czasowa to +2: 00.
Aby uzyskać aktualny znacznik czasu UNIX (w sekundach):
Aby uzyskać kolumnę timestamp jako znacznik czasu UNIX
Aby uzyskać kolumnę z datą i godziną UTC jako znacznik czasu systemu UNIX
Uzyskaj aktualną datę i godzinę strefy czasowej z dodatniej liczby całkowitej znacznika czasu systemu UNIX
Uzyskaj datę i godzinę UTC ze znacznika czasu UNIX
Uzyskaj bieżącą datę i godzinę strefy czasowej z ujemnej liczby całkowitej znacznika czasu systemu UNIX
Istnieją 3 miejsca, w których strefa czasowa może być ustawiona w MySQL:
Uwaga: strefę czasową można ustawić w 2 formatach:
w pliku „my.cnf”
lub
@@ zmienna global.time_zone
Aby zobaczyć, jaką wartość mają
Aby ustawić wartość, użyj jednej z nich:
@@ session.time_zone zmienna
Aby ustawić, użyj jednego z nich:
Zarówno „@@ global.time_zone variable”, jak i „@@ session.time_zone variable” mogą zwrócić „SYSTEM”, co oznacza, że używają strefy czasowej ustawionej w „my.cnf”.
Aby nazwy stref czasowych działały (nawet dla domyślnej strefy czasowej), musisz skonfigurować tabele informacji o strefach czasowych, które muszą być wypełnione: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support. html
Uwaga: nie możesz tego zrobić, ponieważ zwróci NULL:
Skonfiguruj tabele stref czasowych mysql
Aby
CONVERT_TZ
działało, musisz wypełnić tabele stref czasowychJeśli są puste, wypełnij je, uruchamiając to polecenie
jeśli to polecenie wyświetli błąd „ dane za długie dla skrótu kolumny w wierszu 1 ”, może to być spowodowane dodaniem znaku NULL na końcu skrótu strefy czasowej
rozwiązaniem jest uruchomienie tego
(upewnij się, że zasady dotyczące czasu letniego serwerów są aktualne
zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-linux/ )Zobacz pełną historię zmian czasu letniego (DST) dla każdej strefy czasowej
CONVERT_TZ
stosuje również wszelkie niezbędne zmiany czasu letniego w oparciu o zasady podane w powyższych tabelach i wykorzystaną datę.Uwaga:
zgodnie z dokumentacją wartość ustawiona dla strefy czasowej nie zmienia się, jeśli ustawisz ją na przykład jako „+01: 00”, wówczas strefa_czasowa zostanie ustawiona jako przesunięcie względem czasu UTC, który nie jest zgodny z czasem letnim, więc pozostanie niezmieniony przez cały rok.
Tylko nazwane strefy czasowe zmienią czas w czasie letnim.
Skróty takie jak
CET
zawsze będą oznaczać czas zimowy i czasCEST
letni, podczas gdy +01: 00 zawsze będzie oznaczaćUTC
czas + 1 godzinę i oba nie zmienią się wraz z czasem letnim .Strefa
system
czasowa będzie strefą czasową komputera hosta, na którym jest zainstalowany mysql (chyba że mysql tego nie określi)Możesz przeczytać więcej o pracy z czasem letnim tutaj
Powiązane pytania:
Źródła:
źródło
table
zestaw aktualizacjimodified
= '2016-07-07 08:10 +00: 00'UNIX_TIMESTAMP(NOW());
również wszystkich zastosowań, wCONVERT_TZ()
których jednym z parametrów jest `@@ sesja.czas_zone. Aby niezawodnie konwertować czasy danych UTC na znaczniki czasu UNIX, w zasadzie należy najpierw ustawić strefę_czasu sesji.Oto działający przykład:
źródło
PHP i MySQL mają własne domyślne konfiguracje stref czasowych. Powinieneś zsynchronizować czas między bazą danych a aplikacją internetową, w przeciwnym razie możesz uruchomić pewne problemy.
Przeczytaj ten samouczek: Jak zsynchronizować strefy czasowe PHP i MySQL
źródło
date_default_timezone_set("America/Los_Angeles");
imysql_query("SET time_zone='" . date('P', time()) . "'");
działa bardzo elegancko!Wady i zalety są prawie identyczne, zależy to od tego, czy tego chcesz, czy nie.
Uważaj, jeśli strefa czasowa MySQL różni się od czasu systemowego (na przykład PHP), porównywanie czasu lub drukowania do użytkownika będzie wymagało trochę majsterkowania.
źródło