Как получить разницу между двумя датами в формате 360 дней / год, 30 дней / месяц?

Я могу получить разницу между двумя датами (формат DD / MM / YY) с помощью следующего кода;

$date1   = new DateTime("1986-04-27");
$today  = new DateTime("now");
$interval   = $date1->diff($today);
$year       = $interval->format('%y');
$month      = $interval->format('%m');
$day        = $interval->format('%d');

Он отлично работает при расчете 1 год 2 месяца, но когда я пытаюсь рассчитать 1 год 2 месяца 3 дня, он не дает мне точного результата.

Я хотел бы получить разницу между двумя датами, используя 360 дней в году, 30 дней в месяц, без расчета високосных лет.

Например; если в месяце 31 день, система рассчитает его как 30 дней.
Если в году 365 дней, система рассчитает его как 1 год 5 дней. (360 + 5)

Как я могу это сделать?

Спасибо..

1

Решение

Вот способ сделать это:

function diff360($date1, $date2) {
$date1 = new DateTime($date1);
$date2 = new DateTime($date2);
$diff = $date1->diff($date2);
$days = ($date2->format('d') + 30 - $date1->format('d')) % 30;
return array(
"y" => $diff->y,
"m" => $diff->m,
"d" => $days,
"totaldays" => $diff->y * 360 + $diff->m * 30 + $days
);
}

$result = diff360("2016-02-06", "2016-03-06");
var_export($result);

Выход:

array (
'y' => 0,
'm' => 1,
'd' => 0,
'totaldays' => 30,
)
2

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

Просто получите количество дней и вычтите годы / месяцы.

$totalDays = $interval->format('%a');
$years = 0;
$months = 0;
while ($totaldays >= 360) { $years++; $totaldays -=360; }
while ($totaldays >= 30) { $months++; $totaldays -=30; }
$days = $totalDays

Но зачем вам битый формат даты?

1

Класс DateTime рассчитывает разницу на основе реальных дат. Это как бы случайно, будет ли это работать или нет в вашем примере. Если вы хотите использовать пользовательские длины для месяцев, игнорировать високосные годы и т. Д., То вам придется создавать собственные функции самостоятельно.

Я не очень понимаю смысл делать это, хотя?

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector