2013-09-24 3 views
3

Я пытаюсь написать php-код, который сможет вычесть две даты и получить количество дней между двумя датами. Код, который я придумал, приводится нижеВыведите даты, чтобы получить количество дней

<?php 
$c_date = date("Y-m-d"); 
//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, что неверно.

Есть идеи, как преодолеть это?

+2

Добавить инструкцию if, чтобы сравнить даты сначала (какая из них больше и т. Д.), А затем использовать логику, которую вы используете для разницы в 5 дней? – Maximus2012

+0

Где ваш код возвращает что-нибудь? Это просто распечатка разницы. – andrewsi

+0

Я не показывал возврат, потому что проблема связана с разницей в дате, он не может различать более высокие и более низкие даты, поэтому вычитание более низкой даты с более высокой даты также является положительным, что является бесполезным до –

ответ

0

Ok так вот необходимый код, как это было предложено Maximus2012, используя, если заявление, чтобы сравнить даты первого сделал работу. Так вот код

$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; 
} 
0

Я думаю, вы хотите, чтобы прошло несколько дней. если так использовать это:

$interval = $date1->diff($date2)->days; 
-1

Попробуйте это: 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; 
    } 
} 
+0

это решение выглядит функциональный, поэтому не уверен, почему он был опущен. Вы пытались запустить код для разных случаев, чтобы узнать, дает ли он правильный результат? В любом случае есть более эффективные способы сделать это, как опубликовано в других решениях. – Maximus2012

+0

Я знаю, что есть лучшие способы сделать это, но это работает, я написал это быстро, но работает, idk, почему я получил downvoted. –

1

Вы могли бы сравнить как объекты даты-времени и проверить, если срок поставки, превышающий текущую дату и действовать соответствующим образом.

В функции:

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) 

Demo!

2

Try это:

$interval = $date2->diff($date1); 
$returnValue = $interval->d <= 5 && !$interval->invert; 

$returnValue будет true или false (логический тип).

EDIT:
Чтобы быть точным - Для того, чтобы оценить его 1 или 0 вы можете сделать

$returnValue = (int) ($interval->d <= 5 && !$interval->invert); 

EDIT # 2:
$interval->invert это свойство говорит вам, если разница между $date2 и $date1 отрицательный (1) или положительный (0).Это сбивает с толку - расчет в diff методе всегда второй объект (метод аргумент) минус первого объекта (метод вызываемая), поэтому если предположительно

$date1 > $date2 

верно, то

$date1->diff($date2) 

отрицательна (в ярлык).

+1

какой?! $ Промежуток-> инверсия делаю? – Maximus2012

+1

Сообщает вам, является ли разница между датами отрицательной (1) или положительной (0). – matewka

+0

спасибо за обновление. Я думаю, что это делает эффективное решение. – Maximus2012

Смежные вопросы