Intereting Posts

Как выразить разницу между двумя датами в удобочитаемом формате

Если у меня есть две даты – $end_date и $start_date , как я могу выразить разницу между ними в формате «2 года: 4 месяца: 2 дня»?

Я знаю, что могу получить разницу между двумя датами:

 $dif=strtotime($end_date)-strtotime($today); 

Но как я могу преобразовать этот результат в читаемый человеком формат, как показано выше?

Related of "Как выразить разницу между двумя датами в удобочитаемом формате"

Вот как вы можете отформатировать временную метку:

 echo date('dm-Y', strtotime($end_date)) // for DD-MM-YYYY format 

Вы хотите рассчитать разницу между двумя датами, в число дней?

EDIT : код, чтобы найти разницу между датами в «XXYYY YYmonth ZZday». Код предполагает, что даты начала и окончания представлены в формате ГГГГ-ММ-ДД. Если это не относится к вам, пожалуйста, либо измените их на формат ГГГГ-ММ-ДД, либо измените аргументы на mktime () соответственно.

 $endDate = '2011-03-01'; $startDate = '2011-02-02'; $daysPerYear = 365; $daysPerMonth = 30.4; $diffDay = $diffMonth = $diffYear = 0; $endDateTs = mktime(0, 0, 0, substr($endDate, 5, 2), substr($endDate, 8, 2), substr($endDate, 0, 4)); $startDateTs = mktime(0, 0, 0, substr($startDate, 5, 2), substr($startDate, 8, 2), substr($startDate, 0, 4)); $diffDay = ($endDateTs - $startDateTs) / 60 / 60/ 24; // difference between 2 dates in number of days $diffYear = floor($diffDay / $daysPerYear); // difference in years $diffDay = $diffDay % $daysPerYear; // balance days $diffMonth = floor($diffDay / $daysPerMonth); // difference in months $diffDay = ceil($diffDay % $daysPerMonth); // balance days echo ($diffYear ? $diffYear . 'year ' : '') . ($diffMonth ? $diffMonth . 'month ' : '') . ($diffDay ? $diffDay . 'day' : ''); 

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

Надеюсь это поможет.

 function is_leap_year($year) { if($year % 4 == 0) { if($year % 100 == 0) { if($year % 400 == 0) { return true; } else { return false; } } else { return true; } } else { return false; } } function calculate_date($now, $end){ $years = date('Y', strtotime($end)) - date('Y', strtotime($now)) ; if($years < 0) { return "Error: year"; } $mounths = date('m', strtotime($end)) - date('m', strtotime($now)) ; if($mounths < 0) { if($years < 1) { return "Error: mounth and year"; } else { $years --; $mounths += 12; } } $days = date('d', strtotime($end)) - date('d', strtotime($now)) ; if($days < 0){ if($mounths < 1) { if($years < 1) { return "Error: day, mounth and year"; } else { $years --; $mounths += 12; } } else { $mounths --; switch (date('m', strtotime($now))) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: $days +=31; break; case 4: case 6: case 9: case 11: $days +=30; break; case 2: if(is_leap_year(date('Y', strtotime($now)))) { $days += 29; break; } else { $days += 28; break; } } } } return $years . " Years : " . $mounths . " Months : " . $days . " Days Remaining."; } $end_date = new DateTime('2011-08-05'); $end_date = $end_date->format('dm-Y'); $today = date('dm-Y'); $remaining = calculate_date($today, $end_date); echo $remaining; 

И если вы хотите форматировать end_date, вы можете использовать: date ('dm-Y', strtotime ($ end_date)). После этого вы можете рассчитать оставшееся время с помощью calculate_date.

Если достаточно грубой разницы («2 года назад»), вы можете попробовать использовать пакет Date_HumanDiff PEAR.