Làm thế nào để có được sự khác biệt về thời gian tính bằng phút trong PHP


Câu trả lời:


92

Trừ đi phần lớn quá khứ từ phần lớn tương lai và chia cho 60.

Thời gian được thực hiện ở định dạng Unix vì vậy chúng chỉ là một số lớn hiển thị số giây từ January 1, 1970, 00:00:00 GMT


1
@Jerald Giải pháp này hiệu quả với bạn như thế nào? Bạn có phiền để tóm tắt nó ít nhất một chút không? Cảm ơn.
Wafie Ali

7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); điều này sẽ trả về chênh lệch thời gian tính bằng giây, sau đó bạn chỉ có thể chia cho 60 như thế này. $ nInterval = $ nInterval / 60;
Giê

+1 để giải thích những gì cần được thực hiện và không sử dụng lớp DateInterval vô dụng không có phương pháp để làm điều đó: trả lại chênh lệch trong vài phút .
AndreKR

404

Các câu trả lời ở trên dành cho các phiên bản cũ hơn của PHP. Sử dụng lớp DateTime để thực hiện bất kỳ phép tính ngày nào bây giờ vì PHP 5.3 là chuẩn. Ví dụ.

$start_date = new DateTime('2007-09-01 04:10:58');
$since_start = $start_date->diff(new DateTime('2012-09-11 10:25:00'));
echo $since_start->days.' days total<br>';
echo $since_start->y.' years<br>';
echo $since_start->m.' months<br>';
echo $since_start->d.' days<br>';
echo $since_start->h.' hours<br>';
echo $since_start->i.' minutes<br>';
echo $since_start->s.' seconds<br>';

$ Kể từ khi bắt đầu là một đối tượng DateInterval . Lưu ý rằng thuộc tính ngày khả dụng (vì chúng tôi đã sử dụng phương thức diff của lớp DateTime để tạo đối tượng DateInterval).

Đoạn mã trên sẽ xuất ra:

1837 ngày tổng cộng
5 năm
0 tháng
10 ngày
6 giờ
14 phút
2 giây

Để có được tổng số phút:

$minutes = $since_start->days * 24 * 60;
$minutes += $since_start->h * 60;
$minutes += $since_start->i;
echo $minutes.' minutes';

Điều này sẽ xuất ra:

2645654 phút

Đó là số phút thực tế đã trôi qua giữa hai ngày. Lớp DateTime sẽ đưa tính năng tiết kiệm ánh sáng ban ngày (tùy theo múi giờ) vào tài khoản "cách cũ" sẽ không. Đọc hướng dẫn về Ngày và Giờ http://www.php.net/manual/en/book.datetime.php


12
Pitty DateInterval không có phương thức như inSeconds()hoặc một cái gì đó tương tự, bây giờ nó là sự lặp lại mã ở mọi nơi tôi cần để tính toán sự khác biệt trong vài giây.
Marius Balčytis

5
@barius Hoặc bạn có thể viết một hàm bao bọc mã lặp lại hoặc thậm chí mở rộng DateTime và không lặp lại mã của bạn.
Anther

17
+1 cho câu trả lời thích hợp duy nhất tại thời điểm viết bình luận này.
NB

8
Sử dụng lớp DateTime mới là tốt, nhưng tại sao tạo ra DateInterval mà sau đó phải được giải mã một cách khó xử như vậy? $dateFrom = new DateTime('2007-09-01 04:10:58'); $dateTo = new DateTime('2012-09-11 10:25:00'); echo ($dateTo->getTimestamp()-$dateFrom->getTimestamp())/60 ;
dkloke

2
Ai đó có thể giải thích cho tôi tại sao điều này tốt hơn strtotimecâu trả lời ở trên không? Điều này có vẻ giống như một trường hợp của OOP khi Thủ tục là AT LEAST là giải pháp hợp lệ (và ngắn gọn hơn đáng kể).
Bing

341

Đây là câu trả lời:

$to_time = strtotime("2008-12-13 10:42:00");
$from_time = strtotime("2008-12-13 10:21:00");
echo round(abs($to_time - $from_time) / 60,2). " minute";

4
Hàm abs () không bắt buộc nếu ai cũng muốn kiểm tra thời gian âm!
Pran

34
Đối với những người thắc mắc, / 60,2phương tiện: chia cho sáu mươi, làm tròn đến hai chữ số thập phân gần nhất.
Bing

3
strtotime là không đáng tin cậy, tránh. Chỉ hoạt động cho các định dạng ngày cụ thể, chủ yếu liên quan đến Hoa Kỳ.
sivann

14
strtotimecó thể bị lỗi thời nhưng nó không đáng tin nếu bạn sử dụng đúng cách. Lý do là bạn cần phải làm việc với các định dạng ngày nhất quán để có thể đọc (hoặc phân tích) ngày chính xác. Xem ISO 8601và đừng đổ lỗi cho các công cụ: =)
Phil

34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>

1
Điều này là rất gọn gàng và tự giải thích không giống như gunk ở trên.
TheRealChx101

Bạn có thể giải thích lý do tại sao bạn cần một số sleepđể tính chênh lệch ngày?
Nico Haase

2
Cách nào tốt hơn để sử dụng thời gian của bạn trong khi chờ đợi thời gian khác để so sánh hơn là ngủ nhanh. mặc dù về mặt lý thuyết, điều này sẽ cho bạn câu trả lời là 2, có thể giúp mọi người cố gắng hiểu công thức, xác nhận nó đúng.
slappy-x

15

Nó hoạt động trên các chương trình của tôi, tôi đang sử dụng date_diff, bạn có thể kiểm tra date_diffhướng dẫn tại đây .

$start = date_create('2015-01-26 12:01:00');
$end = date_create('2015-01-26 13:15:00');
$diff=date_diff($end,$start);
print_r($diff);

Bạn nhận được kết quả những gì bạn muốn.


1
Thật kỳ lạ, đối với tôi, việc thực thi mã đó không cung cấp sự khác biệt về thời gian tính bằng phút
Nico Haase

Điều này chỉ hữu ích nếu bạn muốn xuất "1 giờ 14 phút". Nếu bạn chỉ muốn vài phút chẳng hạn), bạn phải thực hiện phép toán: ($ diff-> h * 60) + $ diff-> i)
GDP

13

một cách khác với múi giờ.

$start_date = new DateTime("2013-12-24 06:00:00",new DateTimeZone('Pacific/Nauru'));
$end_date = new DateTime("2013-12-24 06:45:00", new DateTimeZone('Pacific/Nauru'));
$interval = $start_date->diff($end_date);
$hours   = $interval->format('%h'); 
$minutes = $interval->format('%i');
echo  'Diff. in minutes is: '.($hours * 60 + $minutes);

4
Nếu bạn muốn ngày cũng vậy, hơn bạn thêm $days = $interval->format('%d');và khác là ($days * 1440 + $hours * 60 + $minutes). Trong nhiều tháng, nhiều năm => cùng logic
Seer

12

Tôi đã viết chức năng này cho một trang blog của mình (sự khác biệt giữa ngày trước và ngày của máy chủ). Nó sẽ cung cấp cho bạn một đầu ra như thế này

"49 giây trước", "20 phút trước", "21 giờ trước", v.v.

Tôi đã sử dụng một chức năng giúp tôi có được sự khác biệt giữa ngày trôi qua và ngày của máy chủ.

<?php

//Code written by purpledesign.in Jan 2014
function dateDiff($date)
{
  $mydate= date("Y-m-d H:i:s");
  $theDiff="";
  //echo $mydate;//2014-06-06 21:35:55
  $datetime1 = date_create($date);
  $datetime2 = date_create($mydate);
  $interval = date_diff($datetime1, $datetime2);
  //echo $interval->format('%s Seconds %i Minutes %h Hours %d days %m Months %y Year    Ago')."<br>";
  $min=$interval->format('%i');
  $sec=$interval->format('%s');
  $hour=$interval->format('%h');
  $mon=$interval->format('%m');
  $day=$interval->format('%d');
  $year=$interval->format('%y');
  if($interval->format('%i%h%d%m%y')=="00000")
  {
    //echo $interval->format('%i%h%d%m%y')."<br>";
    return $sec." Seconds";

  } 

else if($interval->format('%h%d%m%y')=="0000"){
   return $min." Minutes";
   }


else if($interval->format('%d%m%y')=="000"){
   return $hour." Hours";
   }


else if($interval->format('%m%y')=="00"){
   return $day." Days";
   }

else if($interval->format('%y')=="0"){
   return $mon." Months";
   }

else{
   return $year." Years";
   }

}
?>

Lưu nó dưới dạng một tập tin giả sử "date.php". Gọi hàm từ một trang khác như thế này

<?php
 require('date.php');
 $mydate='2014-11-14 21:35:55';
 echo "The Difference between the server's date and $mydate is:<br> ";
 echo dateDiff($mydate);
?>

Tất nhiên bạn có thể sửa đổi hàm để truyền hai giá trị.


10

Tôi nghĩ rằng điều này sẽ giúp bạn

function calculate_time_span($date){
    $seconds  = strtotime(date('Y-m-d H:i:s')) - strtotime($date);

        $months = floor($seconds / (3600*24*30));
        $day = floor($seconds / (3600*24));
        $hours = floor($seconds / 3600);
        $mins = floor(($seconds - ($hours*3600)) / 60);
        $secs = floor($seconds % 60);

        if($seconds < 60)
            $time = $secs." seconds ago";
        else if($seconds < 60*60 )
            $time = $mins." min ago";
        else if($seconds < 24*60*60)
            $time = $hours." hours ago";
        else if($seconds < 24*60*60)
            $time = $day." day ago";
        else
            $time = $months." month ago";

        return $time;
}

Vui lòng thêm một số lời giải thích vào mã của bạn để OP có thể học hỏi từ nó
Nico Haase

Trong vài phút$minutes = floor(($seconds/60)%60);
Aravindh Gopi

8
function date_getFullTimeDifference( $start, $end )
{
$uts['start']      =    strtotime( $start );
        $uts['end']        =    strtotime( $end );
        if( $uts['start']!==-1 && $uts['end']!==-1 )
        {
            if( $uts['end'] >= $uts['start'] )
            {
                $diff    =    $uts['end'] - $uts['start'];
                if( $years=intval((floor($diff/31104000))) )
                    $diff = $diff % 31104000;
                if( $months=intval((floor($diff/2592000))) )
                    $diff = $diff % 2592000;
                if( $days=intval((floor($diff/86400))) )
                    $diff = $diff % 86400;
                if( $hours=intval((floor($diff/3600))) )
                    $diff = $diff % 3600;
                if( $minutes=intval((floor($diff/60))) )
                    $diff = $diff % 60;
                $diff    =    intval( $diff );
                return( array('years'=>$years,'months'=>$months,'days'=>$days, 'hours'=>$hours, 'minutes'=>$minutes, 'seconds'=>$diff) );
            }
            else
            {
                echo "Ending date/time is earlier than the start date/time";
            }
        }
        else
        {
            echo "Invalid date/time data detected";
        }
}

8

Một phiên bản phổ quát hơn trả về kết quả sau vài ngày, giờ, phút hoặc giây bao gồm phân số / số thập phân:

function DateDiffInterval($sDate1, $sDate2, $sUnit='H') {
//subtract $sDate2-$sDate1 and return the difference in $sUnit (Days,Hours,Minutes,Seconds)
    $nInterval = strtotime($sDate2) - strtotime($sDate1);
    if ($sUnit=='D') { // days
        $nInterval = $nInterval/60/60/24;
    } else if ($sUnit=='H') { // hours
        $nInterval = $nInterval/60/60;
    } else if ($sUnit=='M') { // minutes
        $nInterval = $nInterval/60;
    } else if ($sUnit=='S') { // seconds
    }
    return $nInterval;
} //DateDiffInterval

Vui lòng thêm một số lời giải thích vào mã của bạn để OP có thể học hỏi từ nó
Nico Haase

7

Đây là cách tôi hiển thị "xx lần trước" trong php> 5.2 .. đây là thông tin thêm về đối tượng DateTime

//Usage:
$pubDate = $row['rssfeed']['pubDates']; // e.g. this could be like 'Sun, 10 Nov 2013 14:26:00 GMT'
$diff = ago($pubDate);    // output: 23 hrs ago

// Return the value of time different in "xx times ago" format
function ago($timestamp)
{

$today = new DateTime(date('y-m-d h:i:s')); // [2]
//$thatDay = new DateTime('Sun, 10 Nov 2013 14:26:00 GMT');
$thatDay = new DateTime($timestamp);
$dt = $today->diff($thatDay);

if ($dt->y > 0)
{
    $number = $dt->y;
    $unit = "year";
}
else if ($dt->m > 0)
{
    $number = $dt->m;
    $unit = "month";
}   
else if ($dt->d > 0)
{
    $number = $dt->d;
   $unit = "day";
}
else if ($dt->h > 0)
{
    $number = $dt->h;
    $unit = "hour";
}
else if ($dt->i > 0)
{
    $number = $dt->i;
    $unit = "minute";
}
else if ($dt->s > 0)
{
    $number = $dt->s;
    $unit = "second";
}

$unit .= $number  > 1 ? "s" : "";

$ret = $number." ".$unit." "."ago";
return $ret;
}

7
<?php
$start = strtotime('12:01:00');
$end = strtotime('13:16:00');
$mins = ($end - $start) / 60;
echo $mins;
?>

Đầu ra:

75

3

Trừ đi số lần và chia cho 60.

Dưới đây là một ví dụ tính toán thời gian trôi qua từ 2019/02/01 10:23:45phút:

$diff_time=(strtotime(date("Y/m/d H:i:s"))-strtotime("2019/02/01 10:23:45"))/60;

2

Giải pháp của tôi để tìm sự khác biệt giữa hai ngày là ở đây. Với chức năng này, bạn có thể tìm thấy sự khác biệt như giây, phút, giờ, ngày, năm và tháng.

function alihan_diff_dates($date = null, $diff = "minutes") {
 $start_date = new DateTime($date);
 $since_start = $start_date->diff(new DateTime( date('Y-m-d H:i:s') )); // date now
 print_r($since_start);
 switch ($diff) {
    case 'seconds':
        return $since_start->s;
        break;
    case 'minutes':
        return $since_start->i;
        break;
    case 'hours':
        return $since_start->h;
        break;
    case 'days':
        return $since_start->d;
        break;      
    default:
        # code...
        break;
 }
}

Bạn có thể phát triển chức năng này. Tôi đã thử nghiệm và làm việc cho tôi. Đầu ra đối tượng DateInterval ở đây:

/*
DateInterval Object ( [y] => 0 [m] => 0 [d] => 0 [h] => 0 [i] => 5 [s] => 13 [f] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => 0 [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0 ) 
*/

Chức năng sử dụng:

$ date = ngày qua, $ diff = type, ví dụ: "phút", "ngày", "giây"

$diff_mins = alihan_diff_dates("2019-03-24 13:24:19", "minutes");

Chúc may mắn.


0

Điều này sẽ giúp....

function get_time($date,$nosuffix=''){
    $datetime = new DateTime($date);
    $interval = date_create('now')->diff( $datetime );
    if(empty($nosuffix))$suffix = ( $interval->invert ? ' ago' : '' );
    else $suffix='';
    //return $interval->y;
    if($interval->y >=1)        {$count = date(VDATE, strtotime($date)); $text = '';}
    elseif($interval->m >=1)    {$count = date('M d', strtotime($date)); $text = '';}
    elseif($interval->d >=1)    {$count = $interval->d; $text = 'day';} 
    elseif($interval->h >=1)    {$count = $interval->h; $text = 'hour';}
    elseif($interval->i >=1)    {$count = $interval->i; $text = 'minute';}
    elseif($interval->s ==0)    {$count = 'Just Now'; $text = '';}
    else                        {$count = $interval->s; $text = 'second';}
    if(empty($text)) return '<i class="fa fa-clock-o"></i> '.$count;
    return '<i class="fa fa-clock-o"></i> '.$count.(($count ==1)?(" $text"):(" ${text}s")).' '.$suffix;     
}

1
Vui lòng thêm một số lời giải thích vào mã của bạn để OP có thể học hỏi từ nó
Nico Haase

0

Tôi tìm thấy rất nhiều giải pháp nhưng tôi không bao giờ có giải pháp chính xác. Nhưng tôi đã tạo ra một số mã để tìm phút xin vui lòng kiểm tra nó.

<?php

  $time1 = "23:58";
  $time2 = "01:00";
  $time1 = explode(':',$time1);
  $time2 = explode(':',$time2);
  $hours1 = $time1[0];
  $hours2 = $time2[0];
  $mins1 = $time1[1];
  $mins2 = $time2[1];
  $hours = $hours2 - $hours1;
  $mins = 0;
  if($hours < 0)
  {
    $hours = 24 + $hours;
  }
  if($mins2 >= $mins1) {
        $mins = $mins2 - $mins1;
    }
    else {
      $mins = ($mins2 + 60) - $mins1;
      $hours--;
    }
    if($mins < 9)
    {
      $mins = str_pad($mins, 2, '0', STR_PAD_LEFT);
    }
    if($hours < 9)
    {
      $hours =str_pad($hours, 2, '0', STR_PAD_LEFT);
    }
echo $hours.':'.$mins;
?>

Nó cho đầu ra tính theo giờ và phút, ví dụ 01 giờ 02 phút như 01:02

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.