Сегодня я просматривал 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 секунд
У меня два вопроса
Я прочитал документ, в котором сказано, что $previous->diff($now);
шоу $now
— $previous
, Однако, если это наоборот, разве это не будет отрицательным?
Почему один 30 дней, а другой 29 дней?
У меня есть предположение, что это может быть связано с инверсией. Я не совсем уверен, почему он добавляет дополнительный день … но быстрое изменение я сделал:
$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
invert
имущество: $diff->invert
= 1 и $diff2->invert
= 0Это то, что заставляет одного показывать 30 дней, а другого — 29. В примере @Half Crazed обе даты указаны в летнее время, поэтому никаких исправлений нет. Если previous
дата OP
мы 2013-07-29 03:06:40
их разница не будет