Я пытаюсь написать php-код, который сможет вычесть две даты и получить количество дней между двумя датами. Код, который я придумал, приведен ниже
<?php $c_date = date("Ymd"); //Subtracting two dates. $date1 = new DateTime($d_date); //$d_date gets its value from database which i havent shown here $date2 = new DateTime($c_date); $interval = $date1->diff($date2); echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; ?>
Теперь приведенный выше код работает, но я не могу использовать его в соответствии с моими потребностями. Мне нужно выяснить, не указана ли дата доставки ($ d_date) в течение 5 дней с текущей даты и возвращаемого значения 1, если это так.
Так что если $c_date = "2013-09-24"
и $d_date = "2013-09-30"
то я буду возвращаться 1. Но проблема в том, что дата доставки – «2013-09-19» дата доставки имеет давнее прошлое, и я должен возвращать 0, но с текущим кодом разница в день будет равна 5, и поэтому я вернусь 1, что неверно.
Есть идеи о том, как преодолеть это?
Попробуй это:
$interval = $date2->diff($date1); $returnValue = $interval->d <= 5 && !$interval->invert;
$returnValue
будет true
или false
(тип boolean).
РЕДАКТИРОВАТЬ:
Если быть точным – чтобы оценить его до 1
или 0
вы можете сделать
$returnValue = (int) ($interval->d <= 5 && !$interval->invert);
РЕДАКТИРОВАТЬ № 2:
$interval->invert
– свойство, сообщающее вам, если разница между $date2
и $date1
отрицательна (1) или положительна (0). Это запутанно – вычисление в методе diff
всегда является вторым объектом (аргумент метода) минус первый объект (метод callle), поэтому, если предположительно
$date1 > $date2
истинно тогда
$date1->diff($date2)
является отрицательным (в ярлыке).
Вы можете сравнить как объекты datetime, так и проверить, превышает ли дата доставки текущую дату и соответственно.
Как функция:
function check_date($d_date, $c_date) { if($d_date > $c_date) { $date1 = new DateTime($d_date); //$d_date gets its value from database which i havent shown here $date2 = new DateTime($c_date); $interval = $date1->diff($date2); return "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; } else { return false; } }
Прецедент
var_dump( check_date('2013-09-30', '2013-09-24') ); var_dump( check_date('2013-09-19', '2013-09-24') );
Вывод:
string(37) "difference 0 years, 0 months, 6 days " bool(false)
Демо!
Я думаю, вы хотите, чтобы прошло несколько дней. если это так:
$interval = $date1->diff($date2)->days;
Итак, вот требуемый код, как предложил Maximus2012, используя оператор if для сравнения дат, сначала выполнил работу. Итак, вот код
$date1 = new DateTime($ddate[$counter]); $date2 = new DateTime($c_date); if($date2>$date1) { $stat = 0; } $interval = $date1->diff($date2); $d_diff = $interval->d; if($d_diff>5) { $stat = 0; }
Попробуйте следующее: D
function dateInterval($current, $delivery, $days){ $unixCurrent = strtotime($current); $unixDelivery = strtotime($delivery); if ($unixCurrent === false || $unixDelivery === false){ return -2; } if ($unixCurrent > $unixDelivery){ return -1; } else if ($unixCurrent+($days*86400) > $unixDelivery){ return 1; } else { return 0; } }