Пожалуйста, несите меня, пытаясь объяснить мое затруднительное положение. Мне нужно как-то получить разницу между двумя датами, изменив функцию, которую я должен добавить месяцами и годами?PHP Дата разницы с разницей
Задача Функция добавления даты, предоставленная с помощью PHP> = 5.3, не добавляет даты в соответствии с требованиями. Пример: +3 месяцев на 30Nov = 2Mar
Solution Я использую функцию ниже (код реф 2) для получения результатов, которые мне нужны. Пример: +3 месяцев до 30Nov = 28Feb
Однако при использовании ниже (код REF 1) для вычисления разницы он делает это на основе функции сложения обеспечивают PHP> = 5.3 в том, что я получаю 2 вместо разница в 3 месяца между 30Nov и 28Feb.
Если кто-нибудь может помочь придумать точную дату diff на основе кода ref 2 логики I, и я уверен, что другие в одной лодке будут очень благодарны.
< < КОД REF 1 >>
<?php
$datetime1 = new DateTime('2000-11-30');
$datetime2 = new DateTime('2001-02-28');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%m'); // 2
$datetime1 = new DateTime('2000-11-30');
$datetime2 = new DateTime('2001-03-02');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%m'); // 3
?>
< < КОД REF 2 >>
<?php
$datetime = new DateTime('2000-11-30');
$y = 0;
$m = 3;
$d = 0;
if ($d>0){
$datetime->add(new DateInterval('P'.$d.'D'));
}
if ($d<0){
$datetime->sub(new DateInterval('P'.$d.'D'));
}
if ($y!=0){
$init=clone $datetime;
$modifier=$y.' years';
$datetime->modify($modifier);
while ($datetime->format('m')!=$init->format('m')){
$datetime->modify('-1 day');
}
}
if ($m!=0){
$init=clone $datetime;
$modifier=$m.' months';
$back_modifier =-$m.' months';
$datetime->modify($modifier);
$back_to_init= clone $datetime;
$back_to_init->modify($back_modifier);
while ($init->format('m')!=$back_to_init->format('m')){
$datetime->modify('-1 day');
$back_to_init= clone $datetime;
$back_to_init->modify($back_modifier);
}
}
echo $datetime->format('Y-m-d'); // 2001-02-28
?>
РЕШЕНИЕ НАЙДЕНО
Изменяя путь мы используем оригинальную функцию мы вместо этого выясните количество лет и месяцев по желанию, ma благодаря всем полезным предложениям. Причина для y = 1 и m = 4 состоит в том, что год начинается с одного и месяца начинается с одного, иначе это будет 0 и 3, как первоначально запрашивалось, если начинать с нуля.
<?php
function date_yr_mth($date1='2000-11-30',$date2='2001-02-28'){
$y1 = date("Y", strtotime($date1));
$m1 = date("n", strtotime($date1));
$d1 = date("j", strtotime($date1));
$y2 = date("Y", strtotime($date2));
$m2 = date("n", strtotime($date2));
$d2 = date("j", strtotime($date2));
$t2 = date("t", strtotime($date2));
$cm_diff = $m2-$m1;
$cy_diff = $y2-$y1;
if ($d2>=$d1){
$add_mth1 = 1;
}else{
$add_mth1 = 0;
}
$add_mth2 = 12*$cy_diff+$cm_diff;
if ($d2==$t2 && $d2<$d1){
$add_mth3 = 1;
}else{
$add_mth3 = 0;
}
$total_mths = $add_mth1+$add_mth2+$add_mth3;
$arr = array();
$arr['y'] = floor(($total_mths-1)/12)+1;
$arr['m'] = $total_mths-($arr['y']-1)*12;
print_r($arr);
// [y] => 1
// [m] => 4
}
?>
Не могли бы вы объяснить, что именно вы пытаетесь достичь с помощью функции addMonths() в коде ref 2? – ciruvan
Я изменил код ref 2, чтобы показать пример добавления от 3 месяцев до 30Nov, а для результата - 2001-02-28. – TSUK
Итак, вы просите нас вывести рассуждения из всего кода из вашего кода? Почему бы не объяснить простыми словами, с несколькими примерами, как вы хотите, чтобы ваш алгоритм работал? – ciruvan