Некорректное время при конвертации в JSON в Carbon
Всем привет! Столкнулся с проблемой, что из-за часового пояса (в моём случае Московского), неправильно отображается время при конвертации в JSON. У меня есть время, например, 24.07.2020 02:00:00 по Московскому (+3). Если сделать toDateTimeString получается именно это время, всё корректно, но если конвертировать в JSON (toJSON), то выдается на 3 часа меньше, соответственно. Не могу понять куда нужно копать, то ли я уже заработался, то ли баг в Carbon'е.
Воспроизводится просто:
Carbon::now()->toJSON();
Для научного интереса, можно использовать это:
Carbon::now()->toDateTimeString();
Функции, вроде, выполняют примерно одно и тоже, но время разное...
В php.ini время Europe/Moscow, если тянуть из конфига, всё корректно. Функция date_default_timezone_get тоже выдает Europe/Moscow.
Не знаю, стоит ли уточнять, но, на всякий случай. Недавно перешел на Carbon 2. На официальном сайте нашел что-то связанное с миграцией на вторую версию, но мне это не помогло.
Ответы (1 шт):
Поковырялся немного в API Carbon'а. В исходниках встретил следующее:
public function toISOString($keepOffset = false)
{
if (!$this->isValid()) {
return null;
}
$yearFormat = $this->year < 0 || $this->year > 9999 ? 'YYYYYY' : 'YYYY';
$tzFormat = $keepOffset ? 'Z' : '[Z]';
$date = $keepOffset ? $this : $this->copy()->utc();
return $date->isoFormat("$yearFormat-MM-DD[T]HH:mm:ss.SSSSSS$tzFormat");
}
public function toJSON()
{
return $this->toISOString();
}
С пометкой Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z) with UTC timezone.. Собственно, вопрос отпадает, если часовой пояс от UTC. Я на клиенте увеличил время на три чеса и не стал ковыряться дальше с этой проблемой. Может, кто-то подкинет другое решение, буду рад.