sql >> Base de Datos >  >> RDS >> Mysql

Tratar con zonas horarias en PHP y MySQL

Las zonas horarias son molestas, de eso no hay duda. Si te entiendo correctamente, quieres que tu PHP devuelva a la vista los tiempos que están en la zona correcta para el usuario, ¿verdad?

Lo que hago es dentro de la 'vista maestra' o algún tipo de archivo blade.php que se garantiza que se cargará al menos una vez, compruebo si la zona horaria de este usuario está almacenada o no en una variable de sesión. Si no es así, envío una solicitud AJAX al servidor para almacenar el nombre de la zona horaria.

{{-- store timezone in session variables --}}
@if (!Session::has('timezone'))
    <script>
        $(function () {
            var tz = jstz.determine();
            var data = {};
            if (typeof (tz) !== 'undefined') {
                data.timezone = tz.name();
            }
            if (!$.isEmptyObject(data)) {
                $.ajax({
                    type: "POST",
                    url: "{{ url('/api/v1/settings') }}",
                    beforeSend: function (request) {
                        request.setRequestHeader("X-CSRF-TOKEN", "{{ csrf_token() }}");
                    },
                    data: $.param(data),
                });
            }
        });
    </script>
@endif

Tenga en cuenta que este enfoque utiliza el paquete jstz, que puede descargar aquí e incluir en su <head> sección.

Por supuesto, deberá configurar la ruta para esta solicitud, en mi caso, se ve así:

Route::post('api/v1/settings', function () {
    // Save the user's timezone
    if (Request::has('timezone')) {
        Session::put('timezone', Request::get('timezone'));
    }
});

Ahora, cuando desee convertir las cadenas de fecha y hora de la base de datos a la zona horaria correcta, puede obtener la zona horaria diciendo $tz = $request->session()->get('timezone') y luego analiza las fechas con Carbon\Carbon::parse($date, $tz);

En general, le recomendaría que siga almacenando todas las fechas en formato UTC, ya que ese es el estándar y es imperativo que la base de datos permanezca independiente de la zona horaria. Pero si desea cambiar el valor predeterminado, puede editar la línea 'timezone' => 'UTC' en config/app.php . Eso sobrescribirá la zona en la que Laravel tiene sus marcas de tiempo predeterminadas, por lo que su created_at, updated_at se cambiará para reflejar esa nueva zona horaria.