【问题标题】:PHP Calculating Time Difference in Hours Between Two TimezonesPHP计算两个时区之间的时差
【发布时间】:2018-02-26 19:35:06
【问题描述】:

我需要计算两个时区之间的小时数差异,当前面的时区移动到第二天时,我遇到了一些问题。

例子:

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

按照这个问题 (Calculate hours between dates in different time zones) 中的示例,我得到一个不正确的结果:

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

那么我该如何解释另一个时区已经移到新的一天呢?

【问题讨论】:

  • $time_diff = $time_diff > 0 ? $time_diff : $time_diff + 24; 也许这会解决它?

标签: php date time timezone timezone-offset


【解决方案1】:

我设法找到了解决方案,DateInterval 类也不断为我抛出 21,尽管当我输出对象时,我可以看到小时为 3。

由于 DateTime 与 epoch 进行比较并忽略时区,因此我必须为这两个时间创建一个新的 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。(其中一个在前一天午夜之前放置)

【讨论】:

    【解决方案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
    

    【讨论】:

    • 你是摇滚明星 :)
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多