Здравствуйте.
Использую Carbon являющийся расширением DateTime для работы с датой-временем.
Есть задача узнать время полуночи для заданной timestamp даты для заданных часовых поясов.
Например, есть timestamp = 1485943200 и нужно узнать timestamp полуночи для Москвы и Самары в этот день.
$initial = Carbon::createFromTimestamp(1485943200);
$moscow_midnight = $initial->copy()->timezone('Europe/Moscow')->modify('midnight')->getTimestamp();
$samara_midnight = $initial->copy()->timezone('Europe/Samara')->modify('midnight')->getTimestamp();
В результате получается
$moscow_midnight = 1485907200
$samara_midnight = 1485907200
что соответствует полуночи просто по 0 GMT, а не по указанным временным зонам.
Удается получить нужное время если только создавать объект Carbon'а сразу с указанием временной зоны и то, чего нужно получить.
$moscow_midnight = (new Carbon('midnight', 'Europe/Moscow'))->getTimestamp();
$samara_midnight = (new Carbon('midnight', 'Europe/Samara'))->getTimestamp();
Получается
$moscow_midnight = 1485982800
$samara_midnight = 1485979200
Что верно для текущего дня. Но такой метод не совсем то, что мне нужно. Так как вычислять полночь надо относительно заданного в $initial даты, да и вообще, если бы первый способ работал, то было бы удобнее, так как там просто меняю временную зону у конечных объектов и забираю что мне надо.