Laravel. Carbon. Timezone
Originally published at О разработке для Android и гаджетах. Please leave any comments there.
В Laravel есть прекрасный пакет по работе с датами — Carbon. Я долгое время подозревал, что он мне поможет решить проблему с временными зонами на сайте — все временные метки хранятся в UTC, однако выводить данные и фильтровать нужно с учетом временной зоны пользователя (то есть из браузера).
Не стану рассказывать каким образом я получаю временную зону (может быть, напишу об этом позже), опишу вкратце как я добился хранения даты в UTC и прозрачной работе пользователя с фильтрами времени.
Для фильтрации по времени использую следующий код:
$time = "2016-03-30 13:50:00";
$carbon = Carbon::createFromFormat('Y-m-d H:i:s', $time, $location['timezone']); $carbon = $carbon -> setTimezone('UTC');
Полученный объект Carbon я отправляю в метод Where.
Для вывода же данных в нужной временной зоне, я использую мутаторы в Eloquent:
public function getCreatedAtAttribute($value){ return \Carbon\Carbon::parse($value)->timezone('Asia/Yekaterinburg'); }
Временную метку я храню в сессии (напрямую использую только в качестве примера)