Kirill
Новичок
покритикуйте код
При устройстве на работу попросили написать функцию - написал, не взяли, хотелось бы уяснить в чем косяк.
Задача:
Нужно написать функцию, которая получает входными параметрами две даты
(в формате YYYY-MM-DD), а на выходе дает число (может быть дробным)
месяцев между двумя этими датами.
Примеры работы этой функции:
dateDiffInMonths('2007-07-05', '2007-11-05')
5.00537634409
dateDiffInMonths('2007-07-05', '2008-07-25')
12.6451612903
Мое решение:
При устройстве на работу попросили написать функцию - написал, не взяли, хотелось бы уяснить в чем косяк.
Задача:
Нужно написать функцию, которая получает входными параметрами две даты
(в формате YYYY-MM-DD), а на выходе дает число (может быть дробным)
месяцев между двумя этими датами.
Примеры работы этой функции:
dateDiffInMonths('2007-07-05', '2007-11-05')
5.00537634409
dateDiffInMonths('2007-07-05', '2008-07-25')
12.6451612903
Мое решение:
PHP:
<?php
function dateDiffInMonths($start, $end){
$start_time = strtotime($start);
$end_time = strtotime($end);
if($start_time == -1 || $end_time == -1) return false;
if($start_time > $end_time) return false;
$day_time = 60*60*24;
$out = 0;
$counted_time = $start_time;
while($counted_time < $end_time){
$month_days = date("t", $counted_time);
if(mktime(null,null,null,date('m',$counted_time),$month_days,date('Y',$counted_time)) > $end_time){
$diff_time = $end_time-$counted_time;
}
else{
$tmp_end = mktime(null,null,null,date('m',$counted_time),$month_days,date('Y',$counted_time));
if(date("j", $tmp_end) == $month_days && date("j", $counted_time) == 1){
$out += 1;
$counted_time += $month_days*$day_time;
$counted_time += CheckOnSummerTime($counted_time);
continue;
}
else{
$diff_time = $tmp_end-$counted_time;
}
}
$out += $diff_time/($month_days*$day_time);
$counted_time += $diff_time + $day_time;
}
return $out;
}
function CheckOnSummerTime($day){
if(date("H", $day) == date("H", mktime(23,0,0))){
return 60*60;
}
elseif(date("H", $day) == date("H", mktime(1,0,0))){
return -60*60;
}
}
?>