PHP Расчет разницы во времени в часах между двумя часовыми поясами

Мне нужно выяснить разницу в часах между двумя часовыми поясами, и я сталкиваюсь с некоторыми проблемами, когда часовой пояс переходит на следующий день.

Пример:

//Let's say it is 11pm 23:00 in LA
$local_tz = new DateTimeZone('America/Los_Angeles');
$local = new DateTime('now', $local_tz);
$local_hour = $local->format('H');

//NY is 3 hours ahead, so it is 2am, 02:00
$user_tz = new DateTimeZone('America/New_York');
$user = new DateTime('now', $user_tz);
$user_hour = $user->format('H');

Следуя примеру в этом вопросе ( Рассчитать часы между датами в разных часовых поясах), я получаю неверный результат:

$diff = $user_tz->getOffset($local);
error_log('$diff '.gmdate("H:i:s", $diff)); //outputs 20:00:00

Если это было 4 вечера в Лос-Анджелесе, следовательно, 7 вечера в Нью-Йорке, то это легко:

$time_diff = ($user_h - $local_h); //$time_diff = 3;

Но когда Нью-Йорк переходит на следующий день, я снова получаю неверные результаты:

$time_diff = ($user_h - $local_h); //$time_diff = -21;

Итак, как я могу учесть другой часовой пояс, который перешел на новый день?

2 ответа

Вы можете получить разницу в часах между двумя часовыми поясами, используя смещение часового пояса, попробуйте ниже код:

$local_tz = new DateTimeZone('America/Los_Angeles');
$local = new DateTime('now', $local_tz);

//NY is 3 hours ahead, so it is 2am, 02:00
$user_tz = new DateTimeZone('America/New_York');
$user = new DateTime('now', $user_tz);

$local_offset = $local->getOffset() / 3600;
$user_offset = $user->getOffset() / 3600;

$diff = $user_offset - $local_offset;
print_r($diff); //outputs 3

Мне удалось найти решение этой проблемы, класс DateInterval продолжал выбрасывать 21 для меня, хотя, когда я выводил объект, я мог видеть час как 3.

Поскольку DateTime выполняет сравнение с эпохой и игнорирует часовой пояс, мне пришлось создать новый DateTime для обоих времен, а затем выполнить сравнение.

//Let's say it is 11pm 23:00 in LA
$local_tz = new DateTimeZone('America/Los_Angeles');
$local = new DateTime('now', $local_tz);

//NY is 3 hours ahead, so it is 2am, 02:00
$user_tz = new DateTimeZone('America/New_York');
$user = new DateTime('now', $user_tz);

$usersTime = new DateTime($user->format('Y-m-d H:i:s'));
$localsTime = new DateTime($local->format('Y-m-d H:i:s'));

$interval = $usersTime->diff($localsTime);
print_r($interval->h); //outputs 3     

Выполнение тестов с $user->modify("-4 hours"); $local->modify("-4 hours"); возвращает 3. (что ставит один из них незадолго до полуночи предыдущего дня)

Функция для вычисления разницы в часах между двумя часовыми поясами (ввод должен быть в формате "+00:00").

function timezoneDifferenceInHours( $timezone_1, $timezone_2){
    //get hour value of first timezone
    $a = explode(":",$timezone_1)[0];
    //get hour value of second timezone
    $b = explode(":",$timezone_2)[0];
    //calculate difference
    $difference =0;
    if($a < $b)
        $difference = $b-$a;
    else
        $difference = $a-$b;
    return $diffsec;
}

Вызов функции: (возвращает разницу между часовыми поясами в часах)

echo timezoneDifferenceInHours( "-07:00", "+05:30" );

//Output : 12
Другие вопросы по тегам