Fragster
@Fragster
помогло? отметь решением!

Eloquent Carbon не учитывает часовой пояс при парсинге даты?

Есть вот такой ресурс:
class TestResource extends JsonResource
{
  public function toArray(Request $request): array
  {
    return [
      'start' => $this->start->timezone('Europe/Moscow')->toDateTimeLocalString(),
    ];
  }
}


есть вот такой тест кейс:
$d = "2024-09-01T16:00:00.000Z";
    $a = new Test(['start' => $d]);
    dump(
      $d,
      (new TestResource($a))->toArray($request),
      Carbon::parse($d)->timezone('Europe/Moscow')->toDateTimeLocalString()
    );


Если оставить часовой пояс приложения по умолчанию, UTC, то все работает как ожидаемо:
Iu2twYe.png

если же установить часовой пояс приложения в какое-либо значение (например Europe/Moscow), то поведение становится странным:
9jYd1DW.png

где надо настроить, чтобы парсинг даты правильно работал? в идеале указать часовой пояс приложения и отказаться от выставления ->timezone('Europe/Moscow') в ресурсах

вот код контроллера, с которым видно +- ошибку.
https://gist.github.com/FragsterAt/45a827a84fe8591...

часовой пояс приложения - москва. на входе две строки - одна без часового пояса 19:00, вторая - с часовым поясом z и 16:00, что по москве тоже 19:00.

я ожидал что значения d и d_tz будут в модели одинаковые

CnJxSEF.png

при этом если сдвинуть часовой пояс приложения на UTC, то он сдвигается для вывода даты, при этом парсинг все равно кривой

FDCEIuD.png
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 1
@iljaGolubev
$d = Carbon::now(); // использует config('app.timezone')
debug(['NOW',(string)$d->timezone ,$d->toDateTimeLocalString()]);

// использует config('app.timezone') потому что в parse не передана таймзона
$d=Carbon::parse('2024-09-01T16:00:00.000'); 
debug(['parsed no TZ', (string)$d->timezone,$d->toDateTimeLocalString()]);
$d->timezone('Europe/Moscow');
debug(['set MSK', (string)$d->timezone,$d->toDateTimeLocalString()]);

// TZ указано в строке. НЕ ИСПОЛЬЗУЕТ config('app.timezone')
$d=Carbon::parse('2024-09-01T16:00:00.000Z'); 
debug(['parsed UTC', (string)$d->timezone,$d->toDateTimeLocalString()]);
$d->timezone('Europe/Moscow');
debug(['set MSK', (string)$d->timezone,$d->toDateTimeLocalString()]);

/**
array:3 [▼
  0 => "NOW"
  1 => "Europe/Moscow"
  2 => "2024-09-02T10:37:14"
]
array:3 [▼
  0 => "parsed no TZ"
  1 => "Europe/Moscow"
  2 => "2024-09-01T16:00:00"
]
array:3 [▼
  0 => "set MSK"
  1 => "Europe/Moscow"
  2 => "2024-09-01T16:00:00"
]
array:3 [▼
  0 => "parsed UTC"
  1 => "Z"
  2 => "2024-09-01T16:00:00"
]
debug
array:3 [▼
  0 => "set MSK"
  1 => "Europe/Moscow"
  2 => "2024-09-01T19:00:00"
]
*/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы