Ve výchozím nastavení (alespoň u instalací založených na Debianu) se do MySQL nenačítají žádná data časového pásma. Pokud chcete otestovat, zda jsou načteny, zkuste provést:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Pokud vrátí DATETIME
(v tomto případě 2012-06-07 08:00:00
), máte načtená časová pásma. Pokud vrátí NULL
, nejsou. Když není načten, jste omezeni na převod pomocí offsetů (např. +10:00
nebo -6:00
).
To by mělo v mnoha případech fungovat dobře, ale jsou chvíle, kdy je lepší použít pojmenovaná časová pásma, například když se nemusíte starat o letní čas. Spuštěním následujícího příkazu se načtou data časového pásma ze systému (pouze pro Unix. Nejsem si jistý, jaký by byl ekvivalentní příkaz Windows):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Pokud se potřebujete neustále spoléhat na časová pásma MySQL, výše uvedený příkaz by měl být proveden při každé aktualizaci časového pásma systému . Můžete to také jednoduše přidat do týdenní nebo měsíční úlohy cron, aby to udělal za vás automaticky.
Poté, chcete-li zobrazit seznam časových pásem, proveďte následující:
USE mysql;
SELECT * FROM `time_zone_name`;
Všimněte si, že informace o časovém pásmu zabírají v MySQL asi 5 MB. Pokud někdy budete chtít zrušit načtení informací o časovém pásmu, stačí provést následující a restartovat MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
Ne DROP
tyto tabulky nebo se stanou špatné věci.
Upravit:
Na základě komentáře uživatele níže, pokud chcete, aby se časová pásma automaticky aktualizovala při aktualizaci systému, musíte nejprve povolit rootovi přihlášení bez výzvy k zadání hesla.
MySQL>=5.6.6
Spusťte následující [zdroj ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
Vytvořte ~/.my.cnf
soubor (pokud ještě neexistuje) a přidejte následující:
[client]
user=root
password=yourMysqlRootPW
Poté spusťte chmod 600 ~/.my.cnf
aby to nikdo jiný nemohl číst.
Aktualizovat skript
Přidejte do crontab následující skript, který se má spouštět jednou denně:
#!/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
Odstraňte echo
řádky, pokud nechcete žádný výstup.
Poznámka:Toto je (většinou) netestováno. Pokud máte nějaké problémy, dejte mi vědět a já tuto odpověď aktualizuji.