Come posso impostare il fuso orario di MySQL?

Su un server, quando corro:

mysql> select now(); +---------------------+ | now() | +---------------------+ | 2009-05-30 16:54:29 | +---------------------+ 1 row in set (0.00 sec) 

Su un altro server:

 mysql> select now(); +---------------------+ | now() | +---------------------+ | 2009-05-30 20:01:43 | +---------------------+ 1 row in set (0.00 sec) 

Ho pensato che potesse essere utile:

Ci sono tre luoghi in cui il fuso orario potrebbe essere impostato in MySQL:

Nel file “my.cnf” nella sezione [mysqld]

 default-time-zone='+00:00' 

@@ variabile global.time_zone

Per vedere a quale valore sono impostati:

 SELECT @@global.time_zone; 

Per impostare un valore, usa uno dei due:

 SET GLOBAL time_zone = '+8:00'; SET GLOBAL time_zone = 'Europe/Helsinki'; SET @@global.time_zone = '+00:00'; 

(L’utilizzo di fusi orari denominati come “Europa / Helsinki” significa che devi avere una tabella del fuso orario correttamente compilata).

Tieni presente che +02:00 è un offset. Europe/Berlin è un fuso orario (che ha due offset) e CEST è un orario che corrisponde a uno specifico offset.

@@ session.time_zone variable

 SELECT @@session.time_zone; 

Per impostarlo utilizzare uno dei due:

 SET time_zone = 'Europe/Helsinki'; SET time_zone = "+00:00"; SET @@session.time_zone = "+00:00"; 

Entrambi potrebbero restituire SYSTEM, il che significa che usano il fuso orario impostato in my.cnf.

Affinché i nomi di fuso orario funzionino, è necessario configurare le tabelle di informazioni sul fuso orario che devono essere compilate: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Ho anche menzionato come popolare queste tabelle in questa risposta .

Per ottenere l’offset del fuso orario corrente come TIME

 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 

Restituirà 02:00:00 se il tuo fuso orario è +2: 00.

Per ottenere il timestamp UNIX corrente:

 SELECT UNIX_TIMESTAMP(); SELECT UNIX_TIMESTAMP(NOW()); 

Per ottenere la colonna timestamp come timestamp UNIX

 SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name` 

Per ottenere una colonna datetime UTC come timestamp UNIX

 SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name` 

Nota: la modifica del fuso orario non modificherà il datetime o timestamp memorizzato , ma mostrerà un diverso datetime per le colonne timestamp esistenti poiché sono internamente memorizzate come timestamp UTC e visualizzate esternamente nel fuso orario MySQL corrente.

Ho fatto un cheatsheet qui: MySQL dovrebbe avere il suo fuso orario impostato su UTC?

Per impostarlo per la sessione corrente, fai:

 SET time_zone = timezonename; 

Quando puoi configurare il fuso orario del server per MySQL o PHP:

Ricorda:

  1. Cambia il sistema del fuso orario. Esempio per Ubuntu:

     $ sudo dpkg-reconfigure tzdata 
  2. Riavvia il server o puoi riavviare Apache 2 e MySQL:

     /etc/init.d/mysql restart 

Basta eseguirlo sul tuo server MySQL:

 SET GLOBAL time_zone = '+8:00'; 

Dove +8: 00 sarà il tuo fuso orario.

Per chiunque abbia ancora questo problema:

 value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC" 

Ha funzionato per me Basta aggiungere ?serverTimezone=UTC alla fine.

Questo lavoro per me per una posizione in India:

 SET GLOBAL time_zone = "Asia/Calcutta"; SET time_zone = "+05:30"; SET @@session.time_zone = "+05:30"; 

Puoi specificare il fuso orario predefinito del server quando lo avvii, vedi http://dev.mysql.com/doc/refman/5.1/en/server-options.html e in particolare l’opzione --default-time-zone=timezone . Puoi controllare i fusi orari globali e di sessione con

 SELECT @@global.time_zone, @@session.time_zone; 

imposta uno o entrambi con l’istruzione SET , & c; vedi http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html per molti altri dettagli.

Tieni presente che “Paese / Zona” non funziona a volte … Questo problema non dipende da OS, versione di MySQL e hardware: l’ho incontrato da FreeBSD 4 e Slackware Linux nell’anno 2003 fino ad oggi. MySQL dalla versione 3 fino al trunk sorgente più recente. È ODD, ma succede. Per esempio:

 [email protected]# ls -la /usr/share/zoneinfo/US total 8 drwxr-xr-x 2 root root 4096 Apr 10 2013 . drwxr-xr-x 22 root root 4096 Apr 10 2013 .. lrwxrwxrwx 1 root root 18 Jul 8 22:33 Alaska -> ../SystemV/YST9YDT lrwxrwxrwx 1 root root 21 Jul 8 22:33 Aleutian -> ../posix/America/Adak lrwxrwxrwx 1 root root 15 Jul 8 22:33 Arizona -> ../SystemV/MST7 lrwxrwxrwx 1 root root 18 Jul 8 22:33 Central -> ../SystemV/CST6CDT lrwxrwxrwx 1 root root 18 Jul 8 22:33 Eastern -> ../SystemV/EST5EDT lrwxrwxrwx 1 root root 37 Jul 8 22:33 East-Indiana -> ../posix/America/Indiana/Indianapolis lrwxrwxrwx 1 root root 19 Jul 8 22:33 Hawaii -> ../Pacific/Honolulu lrwxrwxrwx 1 root root 24 Jul 8 22:33 Indiana-Starke -> ../posix/America/Knox_IN lrwxrwxrwx 1 root root 24 Jul 8 22:33 Michigan -> ../posix/America/Detroit lrwxrwxrwx 1 root root 18 Jul 8 22:33 Mountain -> ../SystemV/MST7MDT lrwxrwxrwx 1 root root 18 Jul 8 22:33 Pacific -> ../SystemV/PST8PDT lrwxrwxrwx 1 root root 18 Jul 8 22:33 Pacific-New -> ../SystemV/PST8PDT lrwxrwxrwx 1 root root 20 Jul 8 22:33 Samoa -> ../Pacific/Pago_Pago [email protected]# 

E una dichiarazione del genere dovrebbe funzionare:

 SET time_zone='US/Eastern'; 

Ma tu hai questo problema:

Codice errore: 1298. Fuso orario sconosciuto o errato: “EUS / Eastern”

Dai un’occhiata alla sottocartella nella tua directory delle informazioni sulla zona e vedi il nome file ACTUAL per symlink, in questo caso è EST5EDT. Quindi prova questa affermazione:

 SET time_zone='EST5EDT'; 

Ed effettivamente sta funzionando come dovrebbe! 🙂 Tieni a mente questo trucco; Non ho visto che sia documentato nei manuali di MySQL e nella documentazione ufficiale. Ma leggere la documentazione corrispondente è cosa assolutamente da fare: documentazione ufficiale sul fuso orario MySQL 5.5 – e non dimenticare di caricare i dati del fuso orario nel tuo server proprio come quello (esegui come utente root!):

 mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 

Trick numero uno – deve essere fatto esattamente sotto utente root di MySQL. Può fallire o produrre risultati non funzionanti anche da parte dell’utente che ha pieno accesso a un database MySQL – ho visto io stesso il problema tecnico.

Se stai usando PDO:

 $offset="+10:00"; $db->exec("SET time_zone='".$offset."';"); 

Se stai usando MySQLi:

 $db->MySQLi->query("SET time_zone='".$offset."';"); 

Maggiori informazioni sulla formattazione dell’offset qui: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/

Questione antica con un altro suggerimento:

Se hai recentemente cambiato il fuso orario del sistema operativo, ad esempio tramite:

 unlink /etc/localtime ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime 

… MySQL (o MariaDB) non si noterà fino a quando non riavvii il servizio db:

 service mysqld restart 

(o)

 service mariadb restart 

Se si sta utilizzando MySql Workbench, è ansible impostarlo aprendo la visualizzazione dell’amministratore e selezionando la scheda Avanzate. La sezione superiore è “Localizzazione” e la prima casella di controllo dovrebbe essere “default-time-zone”. Controlla quella casella e inserisci il fuso orario desiderato, riavvia il server e dovresti andare.

Devi impostare il fuso orario della tua posizione. In modo che segua il processo qui sotto
Apri il tuo MSQLWorkbench scrivi un semplice comando sql come questo;

 select now();