¿Cómo configuro la zona horaria de MySQL?

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) 

Pensé que esto podría ser útil:

Hay tres lugares donde la zona horaria podría establecerse 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 para él, usa uno:

 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 zona horaria debidamente poblada).

Tenga en cuenta que +02:00 es un desplazamiento. Europe/Berlin es una zona horaria (que tiene dos compensaciones) y CEST es una hora de reloj que corresponde a una compensación específica.

@@ session.time_zone variable

 SELECT @@session.time_zone; 

Para configurarlo, usa uno:

 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 la zona horaria funcionen, debe configurar las tablas de información de la zona horaria 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 desfase de la zona horaria actual como TIME

 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP); 

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

Para obtener la marca de tiempo de 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 una marca de tiempo UNIX

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

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

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

Para configurarlo para la sesión actual, hazlo:

 SET time_zone = timezonename; 

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 

Simplemente ejecuta esto en tu servidor MySQL:

 SET GLOBAL time_zone = '+8:00'; 

Donde +8: 00 será su zona horaria.

Para cualquiera que todavía tenga este problema:

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

Trabajó para mi. Solo agregue ?serverTimezone=UTC al final.

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"; 

Puede especificar la zona horaria predeterminada del servidor cuando la inicia, consulte http://dev.mysql.com/doc/refman/5.1/en/server-options.html y específicamente la --default-time-zone=timezone . Puede verificar las zonas horarias globales y de sesión con

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

establecer uno o ambos con la instrucción SET , & c; ver http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html para más detalles.

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 encontrado desde FreeBSD 4 y Slackware Linux desde el año 2003 hasta la actualidad. 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 una statement como esa debería funcionar:

 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 su directorio de información de zona y vea el nombre de archivo ACTUAL para enlace simbólico, en este caso es EST5EDT. Entonces prueba esta afirmación en su lugar:

 SET time_zone='EST5EDT'; 

¡Y en realidad está funcionando como debería! 🙂 Mantenga este truco en mente; No he visto que esté documentado en los manuales de MySQL y la documentación oficial. Pero leer la documentación correspondiente es imprescindible: documentación oficial de la zona horaria de MySQL 5.5 , y no te olvides de cargar los datos de la zona horaria en tu servidor de esa manera (¡ejecuta 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 funcionen incluso desde el usuario que tiene acceso completo a una base de datos MySQL. Vi el error yo mismo.

Si está usando PDO:

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

Si estás usando MySQLi:

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

Obtenga más información sobre cómo formatear el desplazamiento aquí: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/

Pregunta antigua con una sugerencia más:

Si recientemente ha cambiado la zona horaria del SO, p. Ej. 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 

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 checkbox debe ser “Zona horaria predeterminada”. Marca esa casilla y luego ingresa tu zona horaria deseada, reinicia el servidor y deberías estar listo para continuar.

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

 select now();