2012-05-06 75 views
16

Tôi đã có hai ngày tháng trong phpTrừ hai ngày tháng trong php

$date1 = 'May 3, 2012 10:38:22 GMT' 

$date2 = '06 Apr 2012 07:22:21 GMT' 

Sau đó, tôi lấy hiệu của hai trong số họ

$date2 - $date1 

, và nhận được

Result:6 

Tại sao là kết quả 6 và không 27? ...? Làm cách nào tôi có thể trừ hai ngày và làm cho nó trả về kết quả dựa trên sự khác biệt tháng trong khi trừ đi các năm & ngày & thời gian?

Trả lời

43

Phần 1: Tại sao kết quả là 6?

Ngày tháng chỉ đơn giản là chuỗi khi bạn trừ chúng lần đầu tiên. PHP cố gắng chuyển đổi chúng thành số nguyên. Nó thực hiện điều này bằng cách chuyển đổi cho đến khi không phải là số đầu tiên. Vì vậy, date2 trở thành 6 và date1 trở thành 0.

Phần 2: Làm thế nào để bạn làm cho nó hoạt động?

$datetime1 = strtotime('May 3, 2012 10:38:22 GMT'); 
$datetime2 = strtotime('06 Apr 2012 07:22:21 GMT'); 

$secs = $datetime2 - $datetime1;// == <seconds between the two times> 
$days = $secs/86400; 

Chuyển đổi khi thích hợp.

+0

Tôi có cần phải chuyển đổi các giây giữa hai ngày times..to .. Không có cách nào nhanh hơn –

+0

giây trong một ngày = 60 * 60 * 24 = 86,400 vì vậy chỉ cần chia cho điều đó. – evan

+0

Giải pháp tuyệt vời @evan. Thumbs up (y) – NullPointer

9

Sử dụng DateTimeDateInterval,

$date1 = new DateTime("May 3, 2012 10:38:22 GMT"); 
$date2 = new DateTime("06 Apr 2012 07:22:21 GMT"); 
echo $date1->diff($date2)->format("%d"); 
+0

Điều này sẽ trả lại cho tôi sự khác biệt trong những ngày ... vì đó là những gì tôi muốn .. để tìm sự khác biệt ngày –

+0

Đó không phải là những gì bạn muốn? –

+0

vâng, đó là ..... cảm ơn –

12

Có một cách để sử dụng mktime n làm ngày trong dấu thời gian và sau đó trừ đi và sau đó sử dụng chức năng cập nhật để hiển thị một cách u muốn ....

cách khác là định dạng cả các ngày trong định dạng tương tự sau đó trừ đi ....

thứ ba cách

$date1= new DateTime("May 3, 2012 10:38:22 GMT"); 
$date2= new DateTime("06 Apr 2012 07:22:21 GMT"); 
echo $date1->diff($date2)->("%d"); 

ra cách

$datetime1 = strtotime('May 3, 2012 10:38:22 GMT'); 
$datetime2 = strtotime('06 Apr 2012 07:22:21 GMT'); 
$secs = $datetime2 - $datetime1;// == return sec in difference 
$days = $secs/86400; 
5
$todate= strtotime('May 3, 2012 10:38:22 GMT'); 
$fromdate= strtotime('06 Apr 2012 07:22:21 GMT'); 
$calculate_seconds = $todate- $fromdate; // Number of seconds between the two dates 
$days = floor($calculate_seconds/(24 * 60 * 60)); // convert to days 
echo($days); 

Mã này sẽ tìm thấy sự khác biệt ngày giữa hai ngày ..

đây sản lượng là 27

5

Hầu hết các giải pháp trình bày dường như được làm việc, nhưng tất cả mọi người quên một điều: thời gian.

Lấy evan dụ:

$datetime1 = strtotime('May 3, 2012 10:38:22 GMT'); 
$datetime2 = strtotime('06 Apr 2012 07:22:21 GMT'); 

$secs = $datetime2 - $datetime1;// == <seconds between the two times> 
$days = $secs/86400; 

Khi bạn không cắt bán thời gian, những gì có thể dẫn đến milscalculations. Ví dụ: Khoảng thời gian giữa 2014-05-01 14:00:00 (Y-m-d) và 2014-05-02 07:00:00 sẽ là 0, xxx, chứ không phải 1. Bạn nên cắt bớt phần thời gian của mỗi ngày.

Vì vậy, nó nên là:

$datetime1 = strtotime(date('Y-m-d', strtotime('May 3, 2012 10:38:22 GMT'))); 
$datetime2 = strtotime(date('Y-m-d', strtotime('06 Apr 2012 07:22:21 GMT'))); 

$secs = $datetime2 - $datetime1;// == <seconds between the two times> 
$days = $secs/86400; 
0
echo 'time'.$notification_time= "2008-12-13 10:42:00"; 
date_default_timezone_set('Asia/Kolkata'); 
echo 'cureen'.$currenttime=date('Y-m-d H:i:s'); 
$now = new DateTime("$notification_time"); 
$ref = new DateTime("$currenttime"); 
$diff = $now->diff($ref); 
printf('%d days, %d hours, %d minutes', $diff->d, $diff->h, $diff->i); 
0

Nếu bạn muốn sử dụng diff (nó trả về một đối tượng Dateinterval) phương pháp, cách chính xác là để định dạng với% a.Ý tôi là:

Nếu bạn kiểm tra http://php.net/manual/en/dateinterval.format.php

Cách đúng là:

echo $date1->diff($date2)->format("%a"); 

Để nhận được tất cả các ngày

+0

tên phương thức đã bị bỏ qua, chính xác là: echo $ date1-> diff ($ date2) -> format ("% a"); –

+0

bạn là đúng, tôi sẽ chỉnh sửa câu trả lời của tôi. Cảm ơn –