Come posso impostare il fuso orario di MySQL?


339

Su un server, quando eseguo:

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)

Non c'è solo una differenza di fuso orario qui - ma anche una deriva non così insignificante: "Parla con il tuo DBA di ntp- e vedi cosa è giusto per te!"
colm.anseo,

@ colm.anseo Calmati, è probabilmente la differenza tra l'esecuzione delle query
HosseyNJF,

1
@HosseyNJF di 7 minuti? Pausa caffè tra i confronti?
colm.anseo,

Risposte:


525

Ho pensato che potesse essere utile:

Esistono tre posizioni in cui è possibile impostare il fuso orario 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 per esso utilizzare uno dei due:

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

(L'uso di fusi orari denominati come "Europa / Helsinki" significa che devi avere una tabella dei fusi orari correttamente popolata.)

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

@@ session.time_zone variabile

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 impostare le tabelle di informazioni sul fuso orario che devono essere popolate: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Cito anche come popolare quelle tabelle in questa risposta .

Per ottenere la differenza di fuso orario corrente come TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Restituirà 02:00:00 se il 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 data / ora 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 il timestamp memorizzati , ma mostrerà un datetime diverso per le colonne del timestamp esistenti in quanto sono memorizzate internamente come timestamp UTC e visualizzate esternamente nel fuso orario MySQL corrente.

Ho creato un cheat sheet qui: MySQL dovrebbe avere il fuso orario impostato su UTC?


3
+00:00non è un fuso orario, è un fuso orario. Cosa succede riguardo all'ora legale? Rimane a +0 tutto l'anno?
mpen

1
@Mark Non sono sicuro, i documenti dicono che quando si imposta time_zone="+00:00"si imposta il fuso orario utilizzando un offset da UTC, considerando che il valore impostato non cambia mai e che UTC non segue l'ora legale, posso presumere che rimanga lo stesso tutto l'anno.
Timo Huovinen,

1
@TimoHuovinen Spiacente, volevo dire che +00:00 sembra un offset, quindi è un po 'strano che MySQL abbia scelto quello per rappresentare UTC invece di usare semplicemente la stringa "UTC" stessa. Grazie per le informazioni.
mpen

1
Ho impostato +00: 00, ma ottengo questo errore: errore: opzione trovata senza gruppo precedente nel file di configurazione: /etc/my.cnf
János

5
in Win7, il percorso del file delle impostazioni di mysql èC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca il

83

Per chiunque abbia ancora questo problema:

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

Ha funzionato per me. Basta aggiungere ?serverTimezone=UTCalla fine.


Se il mio fuso orario è UTC + 7, come posso specificarlo nella stringa di connessione? Ho provato ad aggiungere "? ServerTimezone = UTC + 7" e non funziona.
Chiến Nghê,

1
La domanda non riguardava JDBC, ma MySQL stesso.
Luiz,

2
@ ChiếnNghê: dovresti usare al Asia/Ho_Chi_Minhposto di UTCBTW, la domanda è sul cambiamento del fuso orario di MySQL. Quindi, per favore, guarda la risposta di @Timo. Se hai problemi con la finestra mobile di MySQL, aggiungi l'ambiente TZ e dovrebbe funzionare.
Liem Le

2
Questo informa solo JDBC qual è il fuso orario del server, non lo cambia. Per impostare il fuso orario della sessione, controlla le risposte che utilizzanoSET time_zone=...
Nikola Mihajlović,

Stavo ricevendo un errore CDT, ma questo mi ha risolto.
Akexis,

58

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

Ricorda:

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

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

    /etc/init.d/mysql restart

2
Forse questo approccio potrebbe non essere quello giusto. Pensa alla situazione di avere un server con UTC ma l'applicazione sta fornendo dati a un paese su UTC -0600. Per regolare il fuso orario per MySQL, potrebbe essere molto meglio.
Ivanleoncz,

1
Soprattutto se lavori in un'area che copre più fusi orari.
Alexis Wilke,

57

Per impostarlo per la sessione corrente, eseguire:

SET time_zone = timezonename;

14
SELEZIONA @@ session.time_zone;
James Skidmore,

1
Sto cercando di correggere alcuni errori sul mio sistema e devo impostare il mio fuso orario su UTC, non GMT. Sai se ho impostato su '-0: 00' o '+00: 00' questa è un'annotazione UTC o GMT? Non trovo queste informazioni specifiche. Saluti!
rafa.ferreira,

@Castanho, sono abbastanza sicuro che uno funzionerà bene. Dai un'occhiata alla spiegazione su questa domanda: stackoverflow.com/questions/3466630/…
James Skidmore,

Il valore per il fuso orario può essere uguale a quello impostato in PHP, ad esempio SET time_zone = 'America/Boise'. Grazie per la risposta, James Skidmore!
Adam F,

1
@the_nuts sì, l' SET time_zone = 'UTC';impostazione si perde durante il riavvio del server
Timo Huovinen

48

Esegui semplicemente questo sul tuo server MySQL:

SET GLOBAL time_zone = '+8:00';

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


14
Nota che questo è solo temporaneo fino al riavvio di Mysql
rubo77,

Raramente si hanno i privilegi di superutente durante la connessione a un DB. L'impostazione @@session.time_zonecome descritto in altre risposte è un percorso molto migliore.
colm.anseo,

16

Questo lavoro per me per una località in India:

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

devi eseguirlo come query su mysql o scrivere in my.conf con la seguente sintassi default-time-zone = '+05: 30'
Swapnil Bijwe


11

Tieni presente che a volte "Country / Zone" non funziona ... Questo problema non dipende dal sistema operativo, dalla versione di MySQL e dall'hardware - l'ho incontrato da FreeBSD 4 e Slackware Linux nell'anno 2003 ad oggi. MySQL dalla versione 3 fino all'ultimo trunk sorgente. È ODD, ma succede. Per esempio:

root@Ubuntu# 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
root@Ubuntu#

E una dichiarazione del genere dovrebbe funzionare:

SET time_zone='US/Eastern';

Ma hai questo problema:

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

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

SET time_zone='EST5EDT';

E in realtà funziona come dovrebbe! :) Tieni a mente questo trucco; Non l'ho visto documentato nei manuali MySQL e nella documentazione ufficiale. Ma leggere la documentazione corrispondente è cosa da fare: MySQL 5.5 documentazione ufficiale del fuso orario - e non dimenticare di caricare i dati del fuso orario sul tuo server in questo modo (esegui come utente root!):

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

Trucco numero uno: deve essere fatto esattamente sotto l'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 il problema tecnico da solo.


Per favore dimmi il tuo uname -a e ulteriori dettagli - hai alcuni casi funzionanti sul desktop e sul server Ubuntu.
Alexey Vesnin,


7

Questa è una domanda di 10 anni, ma comunque ecco cosa ha funzionato per me. Sto usando MySQL 8.0 con Hibernate 5 e SpringBoot 4.

Ho provato la risposta sopra accettata ma non ha funzionato per me, quello che ha funzionato per me è questo:

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw

Se questo ti aiuta a non dimenticare di votarlo: D


4

Antica domanda con un altro suggerimento:

Se di recente hai modificato 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 noterà fino al riavvio del servizio db:

service mysqld restart

(o)

service mariadb restart

3

Se stai utilizzando MySql Workbench puoi impostarlo aprendo la vista amministratore e selezionando la scheda Avanzate. La sezione superiore è "Localizzazione" e la prima casella di controllo dovrebbe essere "fuso orario predefinito". Seleziona quella casella e inserisci il fuso orario desiderato, riavvia il server e dovresti essere pronto per partire.


2
Il problema è legato a MySQL, non a un programma specifico.
fedorqui "SO smettere di danneggiare"

3
Non ho trovato niente del genere.
Kzqai,

1
Niente del genere
Green,

Per MySQL Workbench 6.3: Instance => Options file => General => International
paulus

5
[ AGGIORNAMENTO per MySQL Workbench 8.0 ] Seleziona "Server" => "File delle opzioni" e nella scheda "Generale" vedi sotto la sezione "Internazionale" . Verrà visualizzata la casella di controllo "fuso orario predefinito" insieme al campo correlato. Quindi puoi impostare il valore del fuso orario predefinito lì.
informatik01,

3

Per prima cosa devi capire qual è il fuso orario che puoi interrogare

SHOW VARIABLES LIKE '%time_zone%'; 

L'output dovrebbe essere simile al seguente

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM

Quindi, se vuoi confermare di essere in un fuso orario come CDT invece di qualcosa come EST, puoi controllare a che ora pensa che la tua macchina sia in arrivo dicendo

SELECT NOW();

Se non è questo il momento che desideri, devi cambiarlo ... tutto quello che devi fare è SET time_zone = timezone_name. Assicurati che sia uno in Continent/Cityformato.

Se ci si trova su un server condiviso perché si dispone di un servizio di hosting, fare riferimento a queste risposte relative alla modifica del file php.ini o del file .htaccess.


1
Ho provato mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Eprima e poi ha SET time_zone = timezone_namefunzionato bene.
Barakat Turki,

1

Devi impostare il fuso orario della tua posizione. Quindi segui il processo seguente
Apri MSQLWorkbench scrivi un semplice comando sql come questo;

select now();

E anche il tuo URL potrebbe essere così;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";

@LuFFy questo è quello che mi chiedevo, quindi per ogni connessione db il fuso orario deve essere impostato SE stiamo usando il fuso orario dell'ambito della sessione e non il fuso orario dell'ambito 'globale'. È utile utilizzare l'ambito della sessione se l'app può avere utenti in diversi fusi orari, giusto?
Valter Ekholm,

1

Per impostare il fuso orario standard su MariaDB devi andare al file 50-server.cnf .

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Quindi puoi inserire la seguente voce nella sezione mysqld.

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

Esempio:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

### Default timezone ###
default-time-zone='+01:00'

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

La modifica deve essere effettuata tramite il file di configurazione, altrimenti il ​​server MariaDB ripristinerà le tabelle mysql dopo un riavvio!



0

Su Windows (IIS) per poter IMPOSTARE GLOBAL time_zone = 'Europa / Helsinki' (o qualsiasi altra cosa) le tabelle di descrizione del fuso orario di MySQL devono essere popolate per prime.

Ho scaricato questi da questo link https://dev.mysql.com/downloads/timezones.html

Dopo aver eseguito la query SQL scaricata, sono stato in grado di impostare il fuso orario GLOBAL e di risolvere il problema riscontrato in SELECT NOW (); stava tornando GMT piuttosto che BST.


Potrei usare il formato numerico "+01: 00" invece di "Europa / Stoccolma", quindi non ho bisogno di scaricare tabelle descrittive time_zone, credo.
Valter Ekholm,

0

Nel mio caso, la soluzione era impostare il parametro serverTimezone in Impostazioni avanzate su un valore appropriato (CET per il mio fuso orario).

Mentre utilizzo IntelliJ, utilizzo il suo modulo Database. Durante l'aggiunta di una nuova connessione al database e dopo aver aggiunto tutti i parametri rilevanti nella scheda Generale, si è verificato un errore nel pulsante "Verifica connessione". Ancora una volta, la soluzione è impostare il parametro serverTimezone nella scheda Avanzate.


0

Se qualcuno sta usando l'hosting condiviso GoDaddy, puoi provare per la seguente soluzione, ha funzionato per me.

Quando si avvia la connessione DB, impostare il comando time_zone nell'oggetto PDO, ad es .:

$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->exec("SET time_zone='+05:30';");

Dove "+05: 30" è la TimeZone dell'India. Puoi cambiarlo secondo le tue necessità.

Dopo di che; tutti i processi MySQL relativi a Data e ora sono impostati con il fuso orario richiesto.

Fonte: https://in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.