2013-08-07 18 views
19

Qual è il modo più semplice per ottenere la differenza in giorni tra due PHP DateTimes, considerando la mezzanotte come un cambio giorno (proprio come fa la funzione SQL DATEDIFF(DAY))?Ottieni una differenza di DateTime in PHP in giorni, considerando la mezzanotte come un giorno

Ad esempio, tra oggi alle 13:00 e domani alle 12:00, dovrei ottenere 1 (giorno), anche se l'intervallo è inferiore a 24 ore.

$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

Perché non basta afferrare la parte data, senza il tempo, e ottenere la differenza da questo? – BLaZuRE

risposta

29

È possibile ignorare la porzione di tempo della stringa della data

$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

come posso ottenere la differenza di ore? –

+0

Questo metodo diff restituirà un numero o una stringa? Sono nel mezzo di una situazione simile e ho bisogno di usare la differenza per alcuni calcoli. – user3521737

6

una semplice soluzione a questo mettere a nudo il tempo o impostarlo su 00:00:00, che dovrebbe sempre dare il risultato desiderato:

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

o

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

il tempo realmente non importa qui

-2

questo esempio può aiutare a:

$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

Questo non funzionerebbe se $ date1_month e $ date2_month sono in diversi mesi. –

5

nota che DateInterval-> giorni è sempre positivo. da qui l'uso di -> invertito.

/** 
* 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 
} 

esempi di utilizzo:

$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) 

esempio di qualche magia di testo:

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"); 
    } 
} 
Problemi correlati