Увидел ответы с помощью решения смещения, и я думаю, что если вы не сэкономите время в базе данных в формате UTC или Unix, они не помогут. Проблема, когда дело доходит до getTimestamp (), заключается в том, что часовой пояс не учитывается, даже когда вы инициируете объект ... Как я могу это объяснить:) ... допустим, у вас есть какое-то событие с датой и временем в вашей базе данных , Вы также правильно настроили часовой пояс. Я добавлю их в vars для этого примера, чтобы он был более заметен:
$dateTime = '25.08.2018 16:45:15';//some event in your db //can be any valid format
$localTimezone = 'Europe/Berlin';
$dateTimeLocal = new \DateTime($dateTime, new \DateTimeZone($localTimezone));
var_dump($dateTimeLocal->getTimestamp());`
Теперь ... когда вы делаете это, вы передаете дату и время вашему конструктору. Вы ожидаете, что php будет уважать ваш часовой пояс, и вы получите метку времени UTC, соответствующую 16:45 в Берлине, что будет UTC 15:45 зимой и UTC 14:45 летом. Этого не произойдет - вы получите метку времени, соответствующую UTC 16:45. Если вы добавите смещение сейчас, у вас будет час или два.
Правильный способ сделать это - инициализировать объект, установить / переключить часовые пояса, создать форматированное время даты, которое учитывает часовой пояс, а затем получить метку времени из отформатированного времени даты. Это может быть немного медленнее, но это провал часового пояса доказать:
$date = '25.08.2018 16:45:15';//some event in your db //can be any valid format
$format = 'Y-m-d H:i:s';//just a format we will use for this example //also can be any valid format
$localTimezone = 'Europe/Berlin';
$remoteTimezone = 'America/Lima';
$dateTime = new \DateTime($date, new \DateTimeZone($localTimezone));
$dateTime->setTimezone(new \DateTimeZone($remoteTimezone));
$timestampLima = DateTime::createFromFormat($format, $dateTime->format($format))->getTimestamp();