March 30, 2016

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');
}

Временную метку я храню в сессии (напрямую использую только в качестве примера)