date — PHP DateTime -> diff

Сегодня я просматривал php-код и обнаружил, что это действительно странно.

<?php
$now = new DateTime("2015-07-29 03:38:55");
$previous = new DateTime("2013-07-29 05:06:40");
$diff = $now->diff($previous);
$diff2 = $previous->diff($now);

printf("%d years, %d month, %d days, %d hours, %d minutes %d seconds.<br/>", $diff->y, $diff->m, $diff->d, $diff->h, $diff->i, $diff->s);
printf('%d years, %d month, %d days, %d hours, %d minutes %d seconds', $diff->y, $diff->m, $diff2->d, $diff2->h, $diff2->i, $diff2->s);

Выход

1 год, 11 месяцев, 30 дней, 22 часа, 32 минуты 15 секунд

1 год, 11 месяцев, 29 дней, 22 часа, 32 минуты 15 секунд

У меня два вопроса

  1. Я прочитал документ, в котором сказано, что $previous->diff($now); шоу $now$previous, Однако, если это наоборот, разве это не будет отрицательным?

  2. Почему один 30 дней, а другой 29 дней?

1

Решение

У меня есть предположение, что это может быть связано с инверсией. Я не совсем уверен, почему он добавляет дополнительный день … но быстрое изменение я сделал:

$now = new DateTime("2015-07-29 03:38:55");
$previous = new DateTime("2013-07-29 05:06:40");

$diff = $now->diff($previous);
$diff2 = $previous->diff($now);

printf("%d years, %d month, %d days, %d hours, %d minutes %d seconds\r\n", $diff->y, $diff->m, ($diff->d - $diff->invert), $diff->h, $diff->i, $diff->s);
printf('%d years, %d month, %d days, %d hours, %d minutes %d seconds', $diff->y, $diff->m, ($diff2->d - $diff2->invert), $diff2->h, $diff2->i, $diff2->s);

И вывод:

1 years, 11 month, 29 days, 22 hours, 32 minutes 15 seconds
1 years, 11 month, 29 days, 22 hours, 32 minutes 15 seconds

Или, альтернативно, вышеупомянутое абсолютно неправильно и является просто совпадением … другое объяснение может состоять в том, что разность дней была значением с плавающей точкой для $diffи так оно было округлено вниз … получая 29 дней. Также возможна проблема високосного года.

редактировать

Вышеприведенное также неверно … если вы измените вывод на float, он покажет целые числа. Это добавляет путаницы. Я оставлю этот ответ, чтобы, возможно, помочь кому-то еще выяснить решение.

$now = new DateTime("2015-07-29 03:38:55", new DateTimeZone('GMT'));
$previous = new DateTime("2013-07-29 05:06:40", new DateTimeZone('GMT'));

$diff = $now->diff($previous);
$diff2 = $previous->diff($now);

printf("%f years, %f month, %f days, %f hours, %f minutes %f seconds %f total days\r\n", $diff->y, $diff->m, $diff->d, $diff->h, $diff->i, $diff->s, $diff->days);
printf('%f years, %f month, %f days, %f hours, %f minutes %f seconds %f total days', $diff->y, $diff->m, $diff2->d, $diff2->h, $diff2->i, $diff2->s, $diff2->days);

Я даже установил часовой пояс в надежде помочь. По-прежнему дает целые числа:

1.000000 years, 11.000000 month, 30.000000 days, 22.000000 hours, 32.000000 minutes 15.000000 seconds 729.000000 total days
1.000000 years, 11.000000 month, 29.000000 days, 22.000000 hours, 32.000000 minutes 15.000000 seconds 729.000000 total days
1

Другие решения

  1. знак различия заключается в invert имущество: $diff->invert= 1 и $diff2->invert= 0
  2. Вы можете увидеть в исходнике php Вот дневная коррекция на 1, когда:
    1. 1-го числа в DST и 2-го числа нет
    2. отметка времени второй даты начинается после метка времени 1-го без коррекция DST
    3. отметка времени второй даты начинается до метка времени 1-го с коррекция DST

Это то, что заставляет одного показывать 30 дней, а другого — 29. В примере @Half Crazed обе даты указаны в летнее время, поэтому никаких исправлений нет. Если previous дата OP мы 2013-07-29 03:06:40их разница не будет

0

По вопросам рекламы [email protected]