2013-08-07 31 views
19

Cách đơn giản nhất để có được sự khác biệt trong ngày giữa hai PHP DateTimes là gì, xem xét nửa đêm là thay đổi ngày (giống như hàm SQL DATEDIFF(DAY))?Nhận chênh lệch DateTime PHP trong ngày, xem xét nửa đêm là thay đổi ngày

Ví dụ: giữa ngày hôm nay lúc 13:00 và ngày mai lúc 12:00, tôi sẽ nhận được 1 (ngày), mặc dù khoảng thời gian ít hơn 24 giờ.

$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

Tại sao không chỉ cần lấy phần ngày, mà không cần thời gian, và nhận được sự khác biệt từ đó? – BLaZuRE

Trả lời

29

Bạn có thể bỏ qua phần thời gian của chuỗi ngày

$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

làm thế nào tôi có thể nhận được sự khác biệt 'giờ'? –

+0

Phương pháp khác này có trả về một số hay một chuỗi không? Tôi đang ở giữa một tình huống tương tự và tôi cần phải sử dụng sự khác biệt cho một số tính toán. – user3521737

6

một giải pháp đơn giản để này để dải thời gian hoặc thiết lập nó để 00:00:00, mà phải luôn luôn cung cấp cho bạn kết quả mong muốn:

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

hoặc

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

thời gian doesnt thực sự vấn đề ở đây

-2

ví dụ này có thể giúp bạn:

$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

Điều này sẽ không hoạt động nếu $ date1_month và $ date2_month là trong các tháng khác nhau. –

5

lưu ý rằng DateInterval-> ngày phải lúc nào cũng tích cực. do đó việc sử dụng -> đảo ngược.

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

ví dụ sử dụng:

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

ví dụ về một số ma thuật văn bản:

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"); 
    } 
} 
Các vấn đề liên quan