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.