Cakephp 3 - конвертировать время из местного часового пояса в UTC - PullRequest
1 голос
/ 04 июля 2019

У меня проблема с правильным часовым поясом при исправлении объекта.Мой запрос на публикацию выглядит так:

   [
    'event_date' => '11.07.2019',
    'start_time' => '15:00',
    'end_time' => '16:00'
   ]

В моей форме есть календарь и два поля, в которых пользователь может выбрать время начала и окончания.Теперь эти значения являются часовым поясом пользователя.Я хочу преобразовать эти значения в UTC и сохранить их с моей сущностью, которая имеет два поля DATETIME и одно DATE.

Чтобы сохранить его правильно без ошибок проверки, у меня есть следующий код для измененияданные перед исправлением:

$event_date = new \DateTime($data['event_date']);

$start_time = new \DateTime($data['start_time']);
$end_time = new \DateTime($data['end_time']);

$start_time->setDate($event_date->format('Y'), $event_date->format('m'), $event_date->format('d'));
$end_time->setDate($event_date->format('Y'), $event_date->format('m'), $event_date->format('d'));

$data['start_time'] = $start_time;
$data['end_time'] = $end_time;

$data['event_date'] = $event_date;

Но, как вы можете видеть из отладки, она неправильно конвертируется.Потому что я нахожусь в часовом поясе Европы, он должен иметь 2 часа меньше.

[
    'event_date' => object(DateTime) {
        date => '2019-07-11 00:00:00.000000'
        timezone_type => (int) 3
        timezone => 'UTC'
    },
    'start_time' => object(DateTime) {
        date => '2019-07-11 15:00:00.000000'
        timezone_type => (int) 3
        timezone => 'UTC'
    },
    'end_time' => object(DateTime) {
        date => '2019-07-11 16:00:00.000000'
        timezone_type => (int) 3
        timezone => 'UTC'
    }
]

Я настроил свой загрузчик так:

Time::setToStringFormat('d.m.Y H:i');
Time::setJsonEncodeFormat('d.m.Y H:i');

FrozenTime::setToStringFormat('d.m.Y H:i');
FrozenTime::setJsonEncodeFormat('d.m.Y H:i');

Date::setToStringFormat('d.m.Y');
Date::setJsonEncodeFormat('d.m.Y');

FrozenDate::setToStringFormat('d.m.Y');
FrozenDate::setJsonEncodeFormat('d.m.Y');


Type::build('time')
    ->useImmutable();
Type::build('date')
    ->useImmutable();

Type::build('datetime')
    // ->useImmutable()
    ->useLocaleParser()
    ->setLocaleFormat('d.m.Y H:i:ss');

Может кто-нибудь помочь мнеВот?Я немного смущен ...

1 Ответ

1 голос
/ 04 июля 2019

Ну, вы вообще не используете объекты Date и DateTime из Cake: \DateTime это означает, что это обычный php DateTime объект.

Исправьте это и используйтеисправьте объекты и посмотрите, что произойдет потом.Также убедитесь, что вы правильно настроили часовой пояс по умолчанию.Прочитайте: https://book.cakephp.org/3.0/en/core-libraries/time.html

...