2017-02-16 7 views
1

Я создал функцию, которая возвращает true, если разница между текущей датой и другой датой, если она меньше x дней.PHP DateTime diff format возвращает -0

Вот моя функция:

private function notBeforeDate($date_to_compare, $interval) { 
    $now = new DateTime('now'); 
    $date = new DateTime($date_to_compare); 
    $diff = $now->diff($date)->format("%r%a"); 

    return $diff < $interval ? true : false; 
} 

Но когда я посылаю ту же дату $diff воли возвращает 0 и день +1 воли возвращает 0.

Например (если предположить, что текущая дата 2017- 02-16):

$this->notBeforeDate('2017-02-15', 1); // $diff = -1 
$this->notBeforeDate('2017-02-16', 1); // $diff = -0 
$this->notBeforeDate('2017-02-17', 1); // $diff = 0 
$this->notBeforeDate('2017-02-18', 1); // $diff = 1 

Как я могу сделать, чтобы получить хорошее значение в моем $diff переменных? Я хочу это:

$this->notBeforeDate('2017-02-15', 1); // $diff = -1 
$this->notBeforeDate('2017-02-16', 1); // $diff = 0 
$this->notBeforeDate('2017-02-17', 1); // $diff = 1 
$this->notBeforeDate('2017-02-18', 1); // $diff = 2 
+0

работает нормально с некоторыми изменениями: - https://eval.in/738465 (только пример) –

+0

2017-02-17 и 2017-02-16 вернет 0 и то, и другое. Я хочу '1', если полученная дата - это день +1 – John

+0

Не вдаваясь в это:' DateTime' звучит так, как будто это возвращает время. «сейчас» прямо здесь для меня 2017-02-16 13:48 ведьма меньше одного дня с 2017-02-16 00:00:00 и 2017-02-17 00:00:00. Я бы посоветовал вместо этого «плакать» вместо «Дата», если бы его дни искали. –

ответ

0

DateTime("now") возвратит дату и время. С учетом «сейчас» в любое время суток будет меньше одного дня с любой даты, которая будет такой же или следующей, если метка времени меньше 24 часов в любом направлении.

Короткий фикс для вас проблемы было бы это:

private function notBeforeDate($date_to_compare, $interval) { 
    $now = new DateTime(Date("Y-m-d")); 
    $date = new DateTime($date_to_compare); 
    $diff = $now->diff($date)->format("%r%a"); 

    return $diff < $interval ? true : false; 
} 

В этом случае время часть удаляется из «теперь». Лучшим решением будет создание решения, в котором будут использоваться только даты, а не время.

Пример: IF DateTime("now") возвращает `2017-02-16 12:00 ', и вы сравниваете его с' 2017-02-16 00:00:00 ', вы получаете 0 дней -12 часов. И то же самое для сравнения с '2017-02-17 00:00:00', которое дает вам 0 дней +12 часов. Когда вы запрашиваете день diff, вы получаете часть дня, которая равна нулю в обоих случаях.

+0

И почему отрицательный голос? Любые причины для этого? –

+0

Спасибо за ваш ответ. Это работает хорошо. Я не знаю, почему ваш ответ был опущен. Не могли бы вы объяснить, почему это работает? – John

+0

Сделано сейчас. Надеюсь, что это объяснит, если нет, я попытаюсь объяснить дальше. –

0

Это даст вам ожидаемые результаты:

function notBeforeDate($date_to_compare) { 
    $now = date_create('now'); 
    $date = date_create($date_to_compare); 


    $diff=date_diff($now,$date); 
    return $diff->format("%r%a"); 
} 
var_dump(notBeforeDate('2017-02-17 12:48:00')) 
+0

Извините, только что отредактирован, чтобы иметь положительные/отрицательные значения –

+0

Ваш ответ не решает мою проблему. $ diff будет всегда -0 и 0 для текущей даты и даты +1 – John