PHP计算两个时区之间的小时时间差。

8

我需要计算两个时区之间的小时差,但是当领先的时区跨越到下一天时,我遇到了一些问题。

例如:

//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;

那么,如何考虑另一个已经进入新一天的时区?

1
$time_diff = $time_diff > 0 ? $time_diff : $time_diff + 24; 这样或许可以解决问题? - Alexey Chuhrov
3个回答

19

您可以使用时区偏移量获取两个时区之间的小时差,尝试以下代码:

$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

你是一位 Rockstar :) - Wolfack

2
我找到了一个解决办法,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。(这将在前一天午夜之前的某个时间执行)


1
注意:并非所有时区都是整小时。这将输出“4”用于‘America/Los_Angeles’和‘America/St_Johns’,但它们相差4.5个小时。$interval->h + ((float)$interval->i / 60) 可以解决问题。 - btraas

-1

编写一个函数来计算两个时区之间的小时差(输入应该是“+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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接