Per impostazione predefinita, (almeno su installazioni basate su Debian) nessun dato di fuso orario viene caricato in MySQL. Se vuoi verificare se sono caricati, prova a eseguire:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Se restituisce un DATETIME
(in questo caso 2012-06-07 08:00:00
), sono stati caricati i fusi orari. Se restituisce NULL
, non lo sono. Quando non viene caricato, sei limitato alla conversione utilizzando gli offset (ad es. +10:00
o -6:00
).
Questo dovrebbe funzionare bene in molti casi, ma ci sono momenti in cui è meglio usare fusi orari con nome, ad esempio per non preoccuparsi dell'ora legale. L'esecuzione del comando seguente carica i dati del fuso orario dal sistema (solo Unix. Non sono sicuro di quale sarebbe il comando equivalente di Windows):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Se hai bisogno di fare continuamente affidamento sui fusi orari di MySQL, il comando precedente dovrebbe essere eseguito ogni volta che il fuso orario del sistema viene aggiornato . Puoi anche semplicemente aggiungerlo a un cron job settimanale o mensile per farlo automaticamente.
Quindi, per visualizzare un elenco di fusi orari, procedi come segue:
USE mysql;
SELECT * FROM `time_zone_name`;
Nota, le informazioni sul fuso orario occupano circa 5 MB in MySQL. Se vuoi scaricare le informazioni sul fuso orario, esegui quanto segue e riavvia MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
Non DROP
queste tabelle o succederanno cose brutte.
Modifica:
Sulla base di un commento dell'utente di seguito, se desideri che i fusi orari vengano aggiornati automaticamente quando aggiorni il sistema, devi prima consentire a root di accedere senza che ti venga richiesta una password.
MySQL>=5.6.6
Esegui il seguente [source ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
Crea un ~/.my.cnf
file (se non esiste ancora) e aggiungi quanto segue:
[client]
user=root
password=yourMysqlRootPW
Quindi esegui chmod 600 ~/.my.cnf
per assicurarti che nessun altro possa leggerlo.
Aggiorna script
Aggiungi il seguente script a crontab da eseguire una volta al giorno:
#!/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
Rimuovi l'echo
righe se non vuoi alcun output.
Nota:questo è (per lo più) non testato. Fammi sapere se hai problemi e aggiornerò questa risposta.