2013-08-07 4 views
19

真夜中を日の変更と考えると(DATEDIFF(DAY) SQL関数と同じように)2つのPHP DateTimesの間の日数を取得する最も簡単な方法は何ですか?真夜中を日の変化とみなしてPHP日時の差を取得する

たとえば、今日の13:00から明日の12:00の間に、間隔が24時間未満であっても1日になるはずです。

$date1 = new DateTime("2013-08-07 13:00:00"); 
$date2 = new DateTime("2013-08-08 12:00:00"); 
echo $date1->diff($date2)->days; // 0 
+2

理由だけではなく、時間なし、日付部分をつかみ、そしてそれからの差異を取得していませんか? – BLaZuRE

答えて

29

日付文字列の時間部分を無視することができます

$date1 = new DateTime(date('Y-m-d', strtotime("2013-08-07 13:00:00"))); 
$date2 = new DateTime(date('Y-m-d', strtotime("2013-08-08 12:00:00"))); 
echo $date1->diff($date2)->days; // 0 
+1

どのように '時間差を得ることができますか? –

+0

このdiffメソッドは数値または文字列を返しますか?私は同様の状況の真っ只中にあり、いくつかの計算にその違いを使用する必要があります。 – user3521737

6

時間を取り除くか、それは常にあなたの望ましい結果与える必要があり、00:00:00にそれを設定するには、このに簡単な解決策:

$date1 = new DateTime("2013-08-07"); 
$date2 = new DateTime("2013-08-08"); 
echo $date1->diff($date2)->days; 

または

$date1 = new DateTime("2013-08-07 00:00:00"); 
$date2 = new DateTime("2013-08-08 00:00:00"); 
echo $date1->diff($date2)->days; 

時間doesntのを本当にここをクリック

-2

この例ではあなたを助けることができる:

$date1 = date_create($d1); 
$date2 = date_create($d2); 
//$FromFullDateTime=$from.$FromTime; 

$date1_month = date_format($date1, 'd'); 
$date2_month = date_format($date2, 'd'); 
$dif = $date2_month - $date1_month; 
+2

$ date1_monthと$ date2_monthが別々の月にある場合、これは機能しません。 –

5

ノートDateInterval->日ということは常に正です。したがって、 - >反転を使用します。

/** 
* return amount of days between dt1 and dt2 
* (how many midnights pass going from dt1 to dt2) 
* 0 = same day, 
* -1 = dt2 is 1 day before dt1, 
* 1 = dt2 is 1 day after dt1, etc. 
* 
* @param \DateTime $dt1 
* @param \DateTime $dt2 
* @return int|false 
*/ 
function getNightsBetween(\DateTime $dt1, \DateTime $dt2){ 
    if(!$dt1 || !$dt2){ 
     return false; 
    } 
    $dt1->setTime(0,0,0); 
    $dt2->setTime(0,0,0); 
    $dti = $dt1->diff($dt2); // DateInterval 
    return $dti->days * ($dti->invert ? -1 : 1); // nb: ->days always positive 
} 

使用例:一部のテキストの魔法の

$dt1 = \DateTime::createFromFormat('Y-m-d', '2014-03-03'); 
$dt2 = \DateTime::createFromFormat('Y-m-d', '2014-02-20'); 
getNightsBetween($dt1, $dt2);  // -11 

$dt1 = \DateTime::createFromFormat('Y-m-d H:i:s', '2014-01-01 23:59:59'); 
$dt2 = \DateTime::createFromFormat('Y-m-d H:i:s', '2014-01-02 00:00:01'); 
getNightsBetween($dt1, $dt2);  // 1 (only 2 seconds later, but still the next day) 

$dt1 = \DateTime::createFromFormat('Y-m-d', '2014-04-09'); 
$dt2 = new \DateTime(); 
getNightsBetween($dt1, $dt2);  // xx (how many days (midnights) passed since I wrote this) 

例:

function getRelativeDay(\DateTime $dt2){ 
    if(!$dt2){ 
     return false; 
    } 
    $n = getNightsBetween(new \DateTime(), $dt2); 
    switch($n){ 
     case 0: return "today"; 
     case 1: return "tomorrow"; 
     case -1: return "yesterday"; 
     default: 
      return $n . (abs($n)>1?"days":"day") . ($n<0?" ago":" from now"); 
    } 
} 
関連する問題