php datetime diff полностью выключен - PullRequest
0 голосов
/ 08 июня 2018

Итак, у меня есть этот очень простой код, но он отказывается работать, и я понятия не имею, почему?

$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

Я просто не успеваю.

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вот обновленный код.Возвращает -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
0 голосов
/ 08 июня 2018

gmdate показывает время без летнего времени, а в Нью-Йорке в настоящее время - летнее время.

Если вы используете «Европа / Лондон», вместо этого у вас есть DST на обоих концах.

$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

0 голосов
/ 08 июня 2018

Когда вы запрашиваете объект даты «сейчас», он возвращает вам текущую дату.Способ форматирования зависит от вашего языка клиента или от того, который вы явно указали.

Однако, когда у вас есть два объекта даты, оба на сейчас (может быть отформатированы как два разных часовых пояса), когдаВы делаете сравнение (или различие), они должны возвращать то же значение, что и по сути, объект даты - это число тиков с 01.01.1970.

Если вы хотите проверить, выведите свойство «ticks» каждой даты, и вы увидите, что они получаются одинаковыми.

Следовательно, ваш код работает нормально.

...