¿Cómo configuro la zona horaria de MySQL?

339

En un servidor, cuando ejecuto:

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

En otro servidor:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
Dios mio
fuente
Aquí no solo hay una diferencia de zona horaria, sino también una deriva de tiempo no tan insignificante: "¡Hable con su DBA sobre ntp- y vea lo que es adecuado para usted!"
colm.anseo
@ colm.anseo Cálmate es probablemente la diferencia entre ejecutar las consultas
HosseyNJF
1
@HosseyNJF por 7 minutos? ¿Descanso para tomar café entre comparaciones?
colm.anseo

Respuestas:

525

Pensé que esto podría ser útil:

Hay tres lugares donde se puede establecer la zona horaria en MySQL:

En el archivo "my.cnf" en la sección [mysqld]

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

@@ global.time_zone variable

Para ver a qué valor están configurados:

SELECT @@global.time_zone;

Para establecer un valor, use cualquiera de los dos:

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

(El uso de zonas horarias con nombre como 'Europa / Helsinki' significa que debe tener una tabla de zonas horarias debidamente poblada).

Tenga en cuenta que +02:00es un desplazamiento. Europe/Berlines una zona horaria (que tiene dos desplazamientos) y CESTes una hora de reloj que corresponde a un desplazamiento específico.

@@ session.time_zone variable

SELECT @@session.time_zone;

Para configurarlo, use cualquiera de los dos:

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

Ambos pueden devolver SYSTEM, lo que significa que usan la zona horaria establecida en my.cnf.

Para que los nombres de zonas horarias funcionen, debe configurar las tablas de información de zonas horarias que deben rellenarse: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . También menciono cómo llenar esas tablas en esta respuesta .

Para obtener el desplazamiento de la zona horaria actual como TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Volverá a las 02:00:00 si su zona horaria es +2: 00.

Para obtener la marca de tiempo UNIX actual:

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

Para obtener la columna de marca de tiempo como una marca de tiempo UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Para obtener una columna de fecha y hora UTC como marca de tiempo UNIX

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

Nota: Cambiar la zona horaria no cambiará la fecha y hora o la marca de tiempo almacenadas , pero mostrará una fecha y hora diferente para las columnas de marcas de tiempo existentes, ya que se almacenan internamente como marcas de tiempo UTC y se muestran externamente en la zona horaria MySQL actual.

Hice una hoja de trucos aquí: ¿MySQL debería tener su zona horaria establecida en UTC?

Timo Huovinen
fuente
3
+00:00no es una zona horaria, es un desplazamiento de tiempo. ¿Qué sucede con respecto al horario de verano? ¿Se queda en +0 todo el año?
mpen
1
@Mark No estoy seguro, los documentos dicen que cuando configuras time_zone="+00:00"la zona horaria usando un desplazamiento desde UTC, considerando que el valor establecido nunca cambia y que UTC no sigue el horario de verano, puedo suponer que permanece igual durante todo el año.
Timo Huovinen
1
@TimoHuovinen Lo siento, quise decir que +00:00 parece un desplazamiento, por lo que es un poco extraño que MySQL lo haya elegido para representar UTC en lugar de simplemente usar la cadena "UTC". Gracias por la info.
mpen
1
Configuré +00: 00, pero recibo este error: error: Opción encontrada sin grupo anterior en el archivo de configuración: /etc/my.cnf
János
55
en Win7, la ruta al archivo de configuración de mysql esC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca
82

Para cualquiera que todavía tenga este problema:

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

Trabajó para mi. Solo agregue ?serverTimezone=UTCal final.

Noel Murphy
fuente
Si mi zona horaria es UTC + 7, ¿cómo podría especificar eso en la cadena de conexión? Intenté agregar "? ServerTimezone = UTC + 7" y no funciona.
Chiến Nghê
1
La pregunta no era sobre JDBC, sino sobre MySQL.
Luiz
2
@ ChiếnNghê: Debería usar en Asia/Ho_Chi_Minhlugar de UTCBTW, la pregunta es sobre cambiar la zona horaria de MySQL. Así que mira la respuesta de @Timo. Si tiene problemas con el acoplador MySQL, agregue el entorno TZ y debería funcionar.
Liem Le
2
Esto solo informa a JDBC cuál es la zona horaria del servidor, no la cambia. Para configurar la zona horaria de la sesión, verifique las respuestas que usanSET time_zone=...
Nikola Mihajlović
Estaba recibiendo un error de CDT, pero esto me lo solucionó.
Akexis
58

Cuando puede configurar el servidor de zona horaria para MySQL o PHP:

Recuerda:

  1. Cambiar el sistema de zona horaria. Ejemplo para Ubuntu:

    $ sudo dpkg-reconfigure tzdata
  2. Reinicie el servidor o puede reiniciar Apache 2 y MySQL:

    /etc/init.d/mysql restart
jane
fuente
2
Quizás este enfoque no sea el correcto. Piense en la situación de tener un servidor con UTC pero su aplicación está enviando datos a un país en UTC -0600. Para ajustar la zona horaria de MySQL, podría ser mucho mejor.
ivanleoncz
1
Especialmente si trabaja en un área que cubre varias zonas horarias.
Alexis Wilke
57

Para configurarlo para la sesión actual, haga lo siguiente:

SET time_zone = timezonename;
James Skidmore
fuente
14
SELECCIONE @@ session.time_zone;
James Skidmore
1
Estoy tratando de corregir algunos errores en mi sistema, y ​​necesito configurar mi time_zone en UTC, no GMT. ¿Sabes si configuro a '-0: 00' o '+00: 00' esta es una anotación UTC o GMT? No estoy encontrando esta información específica. ¡Salud!
rafa.ferreira
@Castanho, estoy bastante seguro de que cualquiera funcionará bien. Echa un vistazo a la explicación de esta pregunta: stackoverflow.com/questions/3466630/…
James Skidmore
El valor para la zona horaria puede ser el mismo que el establecido en PHP, como SET time_zone = 'America/Boise'. Gracias por la respuesta, James Skidmore!
Adam F
1
@the_nuts sí, la SET time_zone = 'UTC';configuración se pierde durante el reinicio del servidor
Timo Huovinen
48

Simplemente ejecute esto en su servidor MySQL:

SET GLOBAL time_zone = '+8:00';

Donde +8: 00 será su zona horaria.

Rico Chan
fuente
14
Tenga en cuenta que esto es solo temporal hasta que reinicie Mysql
rubo77
Raramente uno tiene privilegios de superusuario cuando se conecta a una base de datos. Establecer @@session.time_zonecomo se describe en otras respuestas es una ruta mucho mejor.
colm.anseo
16

Este trabajo para mí para una ubicación en India:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Swapnil Bijwe
fuente
necesita ejecutar esto como consulta en mysql o escribir en my.conf con la siguiente sintaxis default-time-zone = '+05: 30'
Swapnil Bijwe
11

Tenga en cuenta que 'Country / Zone' no funciona a veces ... Este problema no depende del sistema operativo, la versión de MySQL y el hardware: lo he conocido desde FreeBSD 4 y Slackware Linux en el año 2003 hasta hoy. MySQL desde la versión 3 hasta la última fuente troncal. Es ODD, pero SÍ sucede. Por ejemplo:

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#

Y se supone que una declaración como esa funciona:

SET time_zone='US/Eastern';

Pero tienes este problema:

Código de error: 1298. Zona horaria desconocida o incorrecta: 'EUS / Eastern'

Eche un vistazo a la subcarpeta en el directorio de información de su zona y vea el nombre de archivo ACTUAL para el enlace simbólico, en este caso es EST5EDT. Entonces intente esta declaración en su lugar:

SET time_zone='EST5EDT';

¡Y en realidad está funcionando como se supone que debe hacerlo! :) Ten en cuenta este truco; No he visto que esté documentado en los manuales de MySQL y en la documentación oficial. Pero leer la documentación correspondiente es algo que debe hacer: la documentación oficial de la zona horaria de MySQL 5.5 , y no olvide cargar los datos de la zona horaria en su servidor de esa manera (¡ejecute como usuario root!):

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

Truco número uno: debe hacerse exactamente bajo el usuario root de MySQL. Puede fallar o producir resultados que no funcionan incluso si el usuario tiene acceso completo a una base de datos MySQL. Yo mismo vi el problema.

Alexey Vesnin
fuente
Por favor, dime tu uname -a y más detalles- tiene algunos casos de trabajo en el escritorio y el servidor de Ubuntu.
Alexey Vesnin
7

Esta es una pregunta de hace 10 años, pero de todos modos esto es lo que funcionó para mí. Estoy usando MySQL 8.0 con Hibernate 5 y SpringBoot 4.

He intentado la respuesta aceptada anteriormente pero no funcionó para mí, lo que funcionó para mí es esto:

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

Si esto te ayuda, no te olvides de votar: D

hamza saber
fuente
4

Antigua pregunta con una sugerencia más:

Si ha cambiado recientemente la zona horaria del sistema operativo, por ejemplo, a través de:

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

... MySQL (o MariaDB) no se dará cuenta hasta que reinicie el servicio db:

service mysqld restart

(o)

service mariadb restart
inanutshellus
fuente
3

Si está utilizando MySql Workbench , puede configurarlo abriendo la vista de administrador y seleccionando la pestaña Avanzado. La sección superior es "Localización" y la primera casilla de verificación debe ser "zona horaria predeterminada". Marque esa casilla y luego ingrese su zona horaria deseada, reinicie el servidor y debería estar listo para comenzar.

Taylor Lafrinere
fuente
2
El problema está relacionado con MySQL, no con un programa en particular.
fedorqui 'SO deja de dañar'
3
No encontré nada como eso.
Kzqai
1
Nada de eso
verde el
Para MySQL Workbench 6.3: Instancia => Archivo de opciones => General => Internacional
paulus
55
[ ACTUALIZACIÓN para MySQL Workbench 8.0 ] Seleccione "Servidor" => "Archivo de opciones", y en la pestaña "General" vea debajo de la sección "Internacional" . Habrá una casilla de verificación "zona horaria predeterminada" junto con el campo relacionado. Entonces puede establecer el valor de zona horaria predeterminada allí.
informatik01
3

Primero para averiguar cuál es la zona horaria, puede consultar

SHOW VARIABLES LIKE '%time_zone%'; 

Su salida debe ser similar a la siguiente

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

Luego, si desea confirmar que se encuentra en una zona horaria como CDT en lugar de algo como EST, puede verificar a qué hora cree que está su máquina diciendo

SELECT NOW();

Si no es el momento que desea, debe cambiarlo ... todo lo que necesita hacer es SET time_zone = timezone_name. Asegúrese de que sea uno que esté enContinent/City formato.

Si está en un servidor compartido porque tiene un servicio de alojamiento, consulte estas respuestas sobre cómo cambiar el archivo php.ini o el archivo .htaccess.

Erik Toor
fuente
1
Lo intenté mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Eprimero y luego SET time_zone = timezone_namefuncionó bien.
Barakat Turki
1

Debe configurar la zona horaria de su ubicación. Entonces, siga el siguiente proceso
Abra su MSQLWorkbench escriba un comando sql simple como este;

select now();

Y también tu url podría ser así;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
harun ugur
fuente
@LuFFy esto es lo que me preguntaba, por lo que para cada db-connect, la zona horaria debe establecerse SI estamos utilizando la zona horaria de alcance de sesión y no la zona horaria de alcance 'global'. Es bueno usar el alcance de la sesión si la aplicación puede tener usuarios en diferentes zonas horarias, ¿verdad?
Valter Ekholm
1

Para establecer la zona horaria estándar en MariaDB , debe ir al archivo 50-server.cnf .

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

Luego puede ingresar la siguiente entrada en la sección mysqld.

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

Ejemplo:

#
# 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.

El cambio debe hacerse a través del archivo de configuración, de lo contrario, el servidor MariaDB restablecerá las tablas mysql después de un reinicio.

Lukas Kuntze
fuente
1

Edite el archivo de configuración de MySQL

sudo nano /etc/mysql/my.cnf

Desplácese y agréguelos al final. Cambiar a zona horaria relevante

[mysqld]
default-time-zone = "+00:00"

Reiniciar el servidor

sudo service mysql restart
Ivan_ug
fuente
0

En Windows (IIS) para poder CONFIGURAR GLOBAL time_zone = 'Europe / Helsinki' (o lo que sea), las tablas de descripción de MySQL time_zone deben llenarse primero.

Los descargué de este enlace https://dev.mysql.com/downloads/timezones.html

Después de ejecutar la consulta SQL descargada, pude establecer el time_zone GLOBAL y resolver el problema que tenía donde SELECT NOW (); estaba regresando GMT en lugar de BST.

Stewart Kirkpatrick
fuente
Creo que podría usar el formato de número "+01: 00" en lugar de "Europa / Estocolmo", así que no necesité descargar tablas de descripción de time_zone.
Valter Ekholm
0

En mi caso, la solución fue establecer el parámetro serverTimezone en la Configuración avanzada en un valor apropiado (CET para mi zona horaria).

Como uso IntelliJ, uso su módulo de base de datos. Al agregar una nueva conexión a la base de datos y después de agregar todos los parámetros relevantes en la pestaña General, hubo un error en el botón "Probar conexión". Una vez más, la solución es establecer el parámetro serverTimezone en la pestaña Avanzado.

ognjenkl
fuente
0

Si alguien usa GoDaddy Shared Hosting, puede intentar la siguiente solución, funcionó para mí.

Al iniciar la conexión DB, establezca el comando time_zone en mi objeto PDO, por ejemplo:

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

Donde "+05: 30" es la zona horaria de la India. Puede cambiarlo según su necesidad.

Después de esto; Todos los procesos de MySQL relacionados con la fecha y la hora se configuran con la zona horaria requerida.

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

Ashish Pandey
fuente