2016-09-14 11 views
1

У меня есть поле datetime в моей базе данных MySQL. Я использую библиотеку Laravel и Carbon, которая уже включена. Я создаю функцию для сравнения этого поля datetime с текущей датой. В настоящее время при использовании функции diffInDays в Carbon, здесь будет результат:Как найти разные дни между двумя объектами datetime в качестве даты?

Datetime field  | current time   | result 
2016-09-13 23:59:59 | 2016-09-14 16:42:12 | 0 
2016-09-13 12:05:59 | 2016-09-14 16:42:12 | 1 
2016-09-12 23:59:59 | 2016-09-14 16:42:12 | 1 
2016-09-12 12:05:59 | 2016-09-14 16:42:12 | 2 

Однако, я хочу сравнить только дату, поэтому я хочу, чтобы результат:

Datetime field  | current time   | result 
2016-09-13 23:59:59 | 2016-09-14 16:42:12 | 1 
2016-09-13 12:59:59 | 2016-09-14 16:42:12 | 1 
2016-09-12 23:59:59 | 2016-09-14 16:42:12 | 2 
2016-09-12 12:05:59 | 2016-09-14 16:42:12 | 2 

Есть ли уже встроенная функция в PHP/Carbon/другие библиотеки для этого?

+0

DateTime имеет [метод дифференциала()] (http://php.net/manual/en/datetime.diff.php); –

+0

И возвращаемый тип DateInterval имеет свойство 'days'. –

+0

Carbon расширяет DateTime и поэтому, как отмечает mark, вы можете использовать метод 'diff()' – Neat

ответ

2

Самый простой способ сделать это - использовать DateTimeImmutable, установить время до полуночи (например) на обоих, а затем выполнить diff. Это даст вам результат, который вы хотите.

$start = new DateTimeImmutable ("20160101T1530", $dtz); 
$stop = new DateTimeImmutable ("20160102T1300", $dtz); 

// DateTimeImmutable returns new objects when modified. 
$chkStart = $start->modify ("midnight"); 
$chkStop = $stop->modify ("midnight"); 

// Setting second flag to "true" to get absolute difference. 
$diff = $chkStart->diff ($chkStop, true); 
+0

Вместо клонирования вы можете использовать [DateTimeImmutable] (http://php.net/datetimeimmutable). – vascowhite

+0

Спасибо за подсказку. Я как-то полностью пропустил этот класс. Обновил мой ответ в соответствии с вашим предложением. – ChristianF

0

Вы можете попробовать этот код

$checkDate = "2016-09-13 23:59:59"; 
$convertData = Carbon::parse($checkDate)->format('Y-m-d'); 
$createdObject = new Carbon($convertData); 
$now = Carbon::now();  
$difference = $now->diffInDays($createdObject); 
dd($difference); 
+0

Вместо того, чтобы просто отправлять код и призывать OP «попробовать», обычно лучше дать некоторое объяснение вашего кода и почему оно лучше, чем попытка OP. – vascowhite

0

Если углерод Diff() не работает для вас, вы можете попробовать альтернативный метод ..

в контроллере записи ..

$date1  = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', '2016-09-12 13:02:24'); 
$anotherDate = \Carbon\Carbon::parse($date1)->format('Y-m-d'); 

$diff = $this->time_elapsed_string(strtotime($anotherDate)); 
return $diff;  // 2 

создать способ в вашем контроллере.

private function time_elapsed_string($ptime) 
{ 
    $etime = time() - $ptime; 
    if ($etime < 1) 
     return '0 seconds'; 

    $a = array(24 * 60 * 60 => 'day'); 

    foreach ($a as $secs => $str) 
    { 
     $d = $etime/$secs; 
     if ($d >= 1) { 
      $r = floor($d); 
      return intval($r); 
     } 
    } 
} 

Это даст вам разницу в днях ..