Szukaj…


Uwagi

Gdy potrzebujesz obsługiwać informacje o czasie dla bazy użytkowników z całego świata w MySQL, użyj typu danych TIMESTAMP w swoich tabelach.

Dla każdego użytkownika przechowuj kolumnę strefy czasowej preferencji użytkownika. VARCHAR (64) to dobry typ danych dla tej kolumny. Gdy użytkownik zarejestruje się, aby korzystać z systemu, zapytaj o wartość strefy czasowej. Mój to czas atlantycki, America/Edmonton . Twoja może, ale nie musi, być Asia/Kolkata lub Australia/NSW . Przykładem interfejsu użytkownika dla tego ustawienia preferencji jest oprogramowanie WordPress.org.

Na koniec, ilekroć nawiążesz połączenie z programu hosta (Java, php, cokolwiek) z DBMS w imieniu użytkownika, wydaj polecenie SQL

 SET SESSION time_zone='(whatever tz string the user gave you)'

zanim zajmiesz się danymi użytkownika związanymi z czasem. Następnie wszystkie czasy TIMESTAMP , które zainstalowałeś, będą renderowane w czasie lokalnym użytkownika.

Spowoduje to, że wszystkie czasy wchodzenia do twoich tabel będą konwertowane na UTC, a wszystkie czasy będą tłumaczone na lokalne. Działa poprawnie dla NOW () i CURDATE (). Ponownie musisz do tego użyć typów danych TIMESTAMP, a nie DATETIME lub DATE.

Upewnij się, że system operacyjny serwera i domyślne strefy czasowe MySQL są ustawione na UTC. Jeśli nie zrobisz tego przed rozpoczęciem ładowania informacji do bazy danych, naprawienie tego będzie prawie niemożliwe. Jeśli używasz dostawcy do uruchomienia MySQL, nalegaj, aby to zrobił dobrze.

Pobierz bieżącą datę i godzinę w określonej strefie czasowej.

Pobiera to wartość NOW() w czasie lokalnym, w Indiach Czas standardowy, a następnie ponownie w UTC.

SELECT NOW();
SET time_zone='Asia/Kolkata'; 
SELECT NOW();
SET time_zone='UTC'; 
SELECT NOW();

Konwertuj zapisaną wartość „DATA” lub „DATETIME” na inną strefę czasową.

Jeśli masz zapisaną DATE lub DATETIME (gdzieś w kolumnie), została ona zapisana w odniesieniu do określonej strefy czasowej, ale w MySQL strefa czasowa nie jest zapisywana z wartością. Tak więc, jeśli chcesz przekonwertować go na inną strefę czasową, możesz, ale musisz znać pierwotną strefę czasową. Użycie CONVERT_TZ() powoduje konwersję. Ten przykład pokazuje wiersze sprzedawane w Kalifornii w czasie lokalnym.

SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
  FROM sales
 WHERE state_sold = 'CA'

Odzyskaj zapisane wartości `TIMESTAMP` w określonej strefie czasowej

To jest naprawdę łatwe. Wszystkie wartości TIMESTAMP są przechowywane w czasie uniwersalnym i zawsze są konwertowane na bieżące ustawienie strefy time_zone za każdym razem, gdy są renderowane.

SET SESSION time_zone='America/Los_Angeles'; 
SELECT timestamp_sold
  FROM sales
 WHERE state_sold = 'CA'

Dlaczego to? Wartości TIMESTAMP oparte są na czcigodnym typie danych UNIX time_t . Te znaczniki czasu UNIX są przechowywane jako liczba sekund od 1970-01-01 00:00:00 UTC.

Uwaga Wartości TIMESTAMP są przechowywane w czasie uniwersalnym. Wartości DATE i DATETIME są przechowywane w dowolnym czasie lokalnym, który obowiązywał podczas ich przechowywania.

Jakie jest ustawienie lokalnej strefy czasowej mojego serwera?

Każdy serwer ma domyślne globalne ustawienie strefy czasowej skonfigurowane przez właściciela maszyny serwerowej. Możesz znaleźć bieżące ustawienie strefy czasowej w ten sposób:

SELECT @@time_zone

Niestety zwykle daje to wartość SYSTEM , co oznacza, że czas MySQL jest regulowany przez ustawienie strefy czasowej systemu operacyjnego serwera.

Ta sekwencja zapytań (tak, to włamanie ) zwraca przesunięcie w minutach między ustawieniem strefy czasowej serwera a UTC.

CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;

Jak to działa? Dwie kolumny w tabeli tymczasowej z różnymi typami danych to wskazówka. Typy danych DATETIME są zawsze przechowywane w czasie lokalnym w tabelach, a TIMESTAMP w UTC. Zatem INSERT , wykonywana, gdy strefa_czasu jest ustawiona na UTC, przechowuje dwie identyczne wartości daty / godziny.

Następnie instrukcja SELECT jest wykonywana, gdy strefa czasowa jest ustawiona na czas lokalny serwera. TIMESTAMP są zawsze tłumaczone z zapisanego formularza UTC na czas lokalny w instrukcjach SELECT. DATETIME nie są. Zatem operacja TIMESTAMPDIFF(MINUTE...) oblicza różnicę między czasem lokalnym a uniwersalnym.

Jakie wartości strefy czasowej są dostępne na moim serwerze?

Aby uzyskać listę możliwych wartości strefy czasowej w instancji serwera MySQL, użyj tego polecenia.

 SELECT mysql.time_zone_name.name

Zwykle pokazuje listę stref czasowych ZoneInfo prowadzoną przez Paula Eggerta w Internet Assigned Numbers Authority . Na całym świecie istnieje około 600 stref czasowych.

Systemy operacyjne typu Unix (na przykład dystrybucje Linux, BSD i nowoczesne dystrybucje Mac OS) otrzymują rutynowe aktualizacje. Zainstalowanie tych aktualizacji w systemie operacyjnym pozwala działającym instancjom MySQL śledzić zmiany strefy czasowej i zmiany czasu dziennego / standardowego.

Jeśli pojawi się znacznie krótsza lista nazw stref czasowych, serwer jest albo nie w pełni skonfigurowany, albo działa w systemie Windows. Oto instrukcje dla administratora serwera, aby zainstalować i utrzymywać listę ZoneInfo.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow