Tengo MySQL y Laravel en mi servidor local, con configuración predeterminada y mi zona horaria es GMT+2.
No toco nada en la configuración de MySQL y pruebo algo en mi base de datos:
SELECT CURRENT_TIMESTAMP, UTC_TIMESTAMP;Resultados:
CURRENT_TIMESTAMP UTC_TIMESTAMP 2020-06-09 16:34:58 2020-06-09 14:34:58Ahora, quiero solicitar este raw en Laravel:
id device_id lat lng alt at created_at updated_at 1 10 10.000000 10.000000 NULL NULL 2020-06-09 16:21:55 2020-06-09 16:21:55 Aquí está mi prueba usando php artisan tinker :
Muestra las 16:34 en UTC (GMT+0).
Ahora trato de cambiar la configuración de mysql (en /etc/mysql/mysql.conf.d/mysqld.cnf ), y establezco esta configuración:
default_time_zone='+00:00'Reinicio mi servidor:
sudo service mysql restartY luego vuelvo a intentar la misma prueba que la anterior:
CURRENT_TIMESTAMP UTC_TIMESTAMP 2020-06-09 14:42:46 2020-06-09 14:42:46Ahora, el raw muestra algo diferente (de 16 a 14 horas):
id device_id lat lng alt at created_at updated_at 1 10 10.000000 10.000000 NULL NULL 2020-06-09 14:21:55 2020-06-09 14:21:55Y en Laravel:
Muestra las 14:34 en UTC (GMT+0).
Esperaba que Laravel/Carbon (o quizás MySQL) entendiera que la fecha sigue siendo la misma pero parece que no.
Además, con la configuración de la Test 1 , cuando una columna por defecto es CURRENT_TIMESTAMP , Laravel lo entiende como UTC, lo cual es incorrecto porque MySQL lo inicializará como GMT+2 (en mi caso).
Por ejemplo, cuando ejecuto una consulta INSERT INTO en una tabla (fuera de Laravel, de Adminer o PhpMyAdmin) que tiene una columna de marca de tiempo DEFAULT a CURRENT_TIMESTAMP , MySQL insertará "18:00" como GMT+2 mientras que Laravel leerá "18 :00" como GMT+0.
¿Cómo puedo evitar este problema? ¿Es correcto configurar el parámetro mysqld como en Test 2 ?
Convertir la zona horaria de sus fechas de su servidor de base de datos a su servidor de aplicaciones es una mala idea. Deberían funcionar con la misma zona horaria, porque las conversiones de zona horaria no son conversiones 1:1 debido a los cambios de horario de verano. Su entorno local/de desarrollo debe estar lo más cerca posible de sus entornos de producción. Y sería mejor que todas las herramientas (tanto DB como Laravel) estuvieran en GMT+00:00 (= "UTC" en la configuración de Laravel), por lo que se basa en el estándar UTC y podrá reutilizar/intercambiar fácilmente sus datos ( o una parte de él) a otro servicio/usuario con cualquier otra zona horaria ahora o más tarde, las zonas horarias como "GMT+2" deberían aparecer solo cuando desee mostrar una fecha a un usuario que sabe que está en esta zona horaria, no para almacenamiento .
Debe cambiar la zona horaria en la configuración de PHP.
En su archivo php.ini, cambie este valor - date.timezone
o puede configurar la zona horaria en la configuración de Laravel.
en your- app/config/app.php - 'timezone' => 'UTC' cambie este valor.