php 日期时间差异完全关闭

php datetime diff completely off

所以我有这个非常简单的代码,但它拒绝工作,我不知道为什么?

$date1= new DateTime (gmdate('H:i Y-m-d'));
$date2 = new DateTime('now', new DateTimeZone('America/New_York'));

echo $date1->format('H:i Y-m-d') .'<br>'; returns //08:32 2018-06-08
echo $date2->format('H:i Y-m-d') .'<br><br>'; returns //04:32 2018-06-08

$diff = $date1->diff($date2);


$diffTime = $diff->format('%R%H:%I');

echo $diffTime; returns //+02:00

我不是数学家,但我很确定 04:32 和 08:32 之间的区别不是 2 小时,而是 4 小时。

如果我改变它,它有时会变得更差。

    $date1 = new DateTime ('now', new DateTimeZone('Indian/Comoro'));
    $date2 = new DateTime('now', new DateTimeZone('America/New_York'));

    echo $date1->format('H:i Y-m-d') .'<br>'; returns //11:44 2018-06-08
    echo $date2->format('H:i Y-m-d') .'<br><br>'; returns //04:44 2018-06-08


    $diff = $date1->diff($date2);


    $diffTime = $diff->format('%R%H:%I');

    echo $diffTime; returns //+00:00

我什至都不知道。

当您请求 "now" 日期对象时,它 return 是您当前的日期。它的格式取决于您的客户端语言环境,或者您明确指定的语言环境。

但是,当您有两个日期对象时,都在 now(可能格式化为两个不同的时区),当您进行比较(或差异)时,它们应该return 与固有日期对象相同的值是自 1/1/1970 以来的刻度数。

如果你想检查,输出每个日期的"ticks" 属性,你会看到它们是一样的。

因此您的代码绝对可以正常工作。

这是更新后的代码。它returns-07:00

$date1 = new DateTime ('now', new DateTimeZone('Indian/Comoro'));
    $date2 = new DateTime('now', new DateTimeZone('America/New_York'));

    echo $date1->format('h:i Y-m-d') .'<br>';/// returns //11:44 2018-06-08
    echo $date2->format('h:i Y-m-d') .'<br><br>';// returns //04:44 2018-06-08
    $datetime1 = new DateTime($date1->format('h:i Y-m-d'));
    $datetime2 = new DateTime( $date2->format('h:i Y-m-d'));

    $diff = $datetime1->diff($datetime2);


    $diffTime = $diff->format('%R%H:%I');

    echo $diffTime; returns //-07:00

gmdate 显示不带夏令时的时间,而在纽约目前是夏令时。

如果您改用 "Europe/London",则两端都有夏令时。

$date1= new DateTime ('now', new DateTimeZone('Europe/London'));
$date2 = new DateTime('now', new DateTimeZone('America/New_York'));

echo $date1->format('H:i Y-m-d') .'<br>';  
echo $date2->format('H:i Y-m-d') .'<br><br>'; 

$diff = $date1->diff($date2);


$diffTime = $diff->format('%R%H:%I');

echo $diffTime;  //+00:00

https://3v4l.org/b6Gkq