Domyślnie (przynajmniej w instalacjach opartych na Debianie) do MySQL nie są ładowane żadne dane strefy czasowej. Jeśli chcesz sprawdzić, czy są załadowane, spróbuj wykonać:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Jeśli zwraca DATETIME
(w tym przypadku 2012-06-07 08:00:00
), masz załadowane strefy czasowe. Jeśli zwraca NULL
, nie są. Gdy nie jest załadowany, możesz konwertować za pomocą przesunięć (np. +10:00
lub -6:00
).
Powinno to działać dobrze w wielu przypadkach, ale są chwile, kiedy lepiej jest używać nazwanych stref czasowych, na przykład nie martwić się o czas letni. Wykonanie następującego polecenia ładuje dane strefy czasowej z systemu (tylko Unix. Nie jestem pewien, jakie byłoby równoważne polecenie Windows):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Jeśli musisz stale polegać na strefach czasowych MySQL, powyższe polecenie powinno być wykonywane za każdym razem, gdy systemowa strefa czasowa jest aktualizowana . Możesz też po prostu dodać go do tygodniowego lub miesięcznego zadania crona, aby zrobić to automatycznie.
Następnie, aby wyświetlić listę stref czasowych, wykonaj następujące czynności:
USE mysql;
SELECT * FROM `time_zone_name`;
Uwaga, informacje o strefie czasowej zajmują w MySQL około 5 MB. Jeśli kiedykolwiek będziesz chciał wyładować informacje o strefie czasowej, po prostu wykonaj następujące czynności i uruchom ponownie MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
Nie DROP
te stoły lub zdarzy się coś złego.
Edytuj:
Na podstawie poniższego komentarza użytkownika, jeśli chcesz, aby strefy czasowe były automatycznie aktualizowane podczas aktualizacji systemu, musisz najpierw zezwolić rootowi na zalogowanie się bez pytania o hasło.
MySQL>=5.6.6
Wykonaj następujące [źródło ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
Utwórz ~/.my.cnf
plik (jeśli jeszcze nie istnieje) i dodaj:
[client]
user=root
password=yourMysqlRootPW
Następnie uruchom chmod 600 ~/.my.cnf
aby upewnić się, że nikt inny nie może go przeczytać.
Aktualizuj skrypt
Dodaj następujący skrypt do crontab, aby był wykonywany raz dziennie:
#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24
# hours and do not have ".tab" in the name (since these are not timezone files)
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
echo "Updating MySQL timezone info"
# Note, suppressing STDERR here because of the .tab files above
# that cause warnings.
mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
echo "Done!\n"
fi
Usuń echo
wiersze, jeśli nie chcesz żadnego wyjścia.
Uwaga:jest to (w większości) nietestowane. Daj mi znać, jeśli masz jakiekolwiek problemy, a zaktualizuję tę odpowiedź.