Попытка получить временные метки углерода в разных часовых поясах
Мы запускаем приложение Laravel с MySQL DB. БД состоит из множества записей, относящихся к разным проектам. Идея состоит в том, что каждый проект имеет свой часовой пояс и выводит соответствующие записи с соответствующими датами в соответствующем формате. Таким образом, чтобы иметь возможность изменять часовые пояса и для совместимости, все записи хранятся в часовом поясе UTC (часовой пояс приложения по умолчанию также установлен на UTC). Проблема в том, что, например, нам нужно получить сегодняшние записи, но в часовом поясе проекта , а не в формате UTC. Мы используем Carbon, но это только форматыдату вывода и по-прежнему сравнивает их в часовом поясе UTC. Например, запись сделана 7 декабря, 22.32 по всемирному координированному времени. Но по данным Europe/Moscow, он был сделан 8 декабря 01.32, и его следует рассматривать как сегодняшнюю запись для проекта с часовым поясом Europe/Moscow. Тем не менее, даже с учетом московского часового пояса, Carbon считает его вчерашним днем (по всемирному координированному времени). Мы используем whereDate в запросе:
whereDate( 'created_at', Carbon::now($project->timezone)->startOfDay() )
Проблема в том, что Carbon не делает разницы между Carbon :: now («UTC») и Carbon :: now («Европа / Москва»). Если вы сравните их, это даст ноль:
$tz1 = Carbon::now('UTC');
$tz2 = Carbon::now('Europe/Moscow');
echo tz1->diffInHours(tz2) //0
Что я скучаю? Как мне это сделать правильно?
1 ответ
$tz1
а также
$tz2
иметь информацию о часовом поясе с ними, и оба содержат информацию о
now()
время. Вот почему нет никакой разницы. Измените данные часового пояса, чтобы сделать их нормальным часовым поясом после получения с помощью
shiftTimezone()
. так
$tz1 = Carbon::now('UTC');
$tz2 = Carbon::now('Europe/Moscow')->shiftTimezone('UTC');
echo tz1->diffInHours(tz2) //should be appropriate