Попытка получить временные метки углерода в разных часовых поясах

Мы запускаем приложение 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 
Другие вопросы по тегам