PHP Date Calculator Возвращает неправильные дни - PullRequest
2 голосов
/ 28 апреля 2019

Я использую калькулятор ниже, чтобы определить годы, месяцы и дни между установленной датой и текущей датой.Я думал, что это работало нормально, но потом он подошел к отметке года, и я заметил, что это не работает должным образом.Завтра на самом деле, когда будет отметка в один год, но в настоящее время она возвращает 11 months, 34 days.Кто-нибудь может сказать мне, что не так?Это должно быть 11 months, 30 days.

function relationshipTimer($functionDate)
{
    $date1 = $functionDate;
    $date2 = date("Y-m-d");
    $diff = abs(strtotime($date2) - strtotime($date1));
    $years = floor($diff / (365 * 60 * 60 * 24));
    $months = floor(($diff - ($years * 365 * 60 * 60 * 24)) / ((365 * 60 * 60 * 24) / 12));
    $days = floor(($diff - $years * 365 * 60 * 60 * 24 - $months * 30 * 60 * 60 * 24) / (60 * 60 * 24));
    if ($years > 0) {echo $years . " Year";}
    if ($years > 1) {echo "s ";}
    if ($months > 0) {echo " " . $months . " Month";}
    if ($months > 1) {echo "s ";}
    if ($date1 == $date2) {echo "1 Day ";}
    if ($days > 0) {echo $days . " Day";}
    if ($days > 1) {echo "s ";}
}

И вот откуда берется $ functionDate:

relationshipTimer("2018-04-28");

1 Ответ

5 голосов
/ 28 апреля 2019

Когда вы вычисляете $days, вы предполагаете, что все месяцы имеют продолжительность 30 дней, что, очевидно, неправильно. Таким образом, вы получаете год, который составляет 11 месяцев плюс 35 дней (36 дней для високосных лет).

Обработка дат сложная. Вы всегда должны использовать специализированные инструменты, такие как PHP DateTime::diff()

Например, с:

$date1 = new DateTime("2018-04-28");
$date2 = new DateTime("2019-04-27");
$diff = $date2->diff($date1);
print $diff->format("%y years %m months %d days\n");

... вы получите (потому что в апреле 30 дней):

0 years 11 months 29 days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...