Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Lidando com fusos horários em PHP e MySQL


fusos horários são irritantes, não há dúvida sobre isso. Se estou te entendendo corretamente, você quer que seu PHP retorne os tempos para a view que estão na zona correta para o usuário, certo?

O que eu faço é dentro da 'master view' ou algum arquivo sort ou blade.php que é garantido para ser carregado pelo menos uma vez, eu verifico se o fuso horário deste usuário está ou não armazenado em uma variável de sessão. Se não for, envio uma solicitação AJAX ao servidor para armazenar o nome do fuso horário.
{{-- 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

Observe que essa abordagem utiliza o pacote jstz, que você pode baixar aqui e inclua em seu <head> seção.

Claro que você vai precisar configurar a rota para essa requisição, para o meu caso, fica assim:
Route::post('api/v1/settings', function () {
    // Save the user's timezone
    if (Request::has('timezone')) {
        Session::put('timezone', Request::get('timezone'));
    }
});

Agora, quando você deseja converter as strings de data e hora do banco de dados para o fuso horário correto, você pode obter o fuso horário dizendo $tz = $request->session()->get('timezone') e, em seguida, analise as datas com Carbon\Carbon::parse($date, $tz);

Em geral, eu recomendo que você mantenha o armazenamento de todas as datas no formato UTC, pois esse é o padrão e é imperativo que o banco de dados permaneça agnóstico de fuso horário. Mas se você quiser alterar o padrão, você pode editar a linha 'timezone' => 'UTC' em config/app.php . Isso irá sobrescrever a zona que o Laravel padroniza seus timestamps, então seu created_at, updated_at será alterado para refletir esse novo fuso horário.