Cara mendapatkan perbedaan waktu dalam hitungan menit dalam PHP

270

Bagaimana cara menghitung perbedaan menit antara dua kali tanggal dalam PHP?

Tomasz Smykowski
sumber

Jawaban:

92

Kurangi yang paling masa lalu dari yang paling masa depan dan bagi dengan 60.

Waktu dilakukan dalam format Unix sehingga hanya sejumlah besar yang menunjukkan jumlah detik January 1, 1970, 00:00:00 GMT

Oli
sumber
1
@ Emerald Bagaimana solusi ini bekerja untuk Anda? Apakah Anda keberatan untuk menjelaskannya setidaknya sedikit? Terima kasih.
Wafie Ali
7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); ini akan mengembalikan selisih waktu dalam detik, maka Anda bisa membagi dengan 60 seperti ini. $ nInterval = $ nInterval / 60;
Jerald
+1 untuk menjelaskan apa yang perlu dilakukan dan tidak menggunakan kelas DateInterval yang tidak berguna yang tidak memiliki metode untuk melakukan hal itu: kembalikan perbedaan dalam hitungan menit .
AndreKR
404

Jawaban di atas adalah untuk versi PHP yang lebih lama. Gunakan kelas DateTime untuk melakukan perhitungan tanggal sekarang karena PHP 5.3 adalah normanya. Misalnya.

$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>';

$ since_start adalah objek DateInterval . Perhatikan bahwa properti days tersedia (karena kami menggunakan metode diff dari kelas DateTime untuk menghasilkan objek DateInterval).

Kode di atas akan menampilkan:

1837 hari total
5 tahun
0 bulan
10 hari
6 jam
14 menit
2 detik

Untuk mendapatkan jumlah total menit:

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

Ini akan menampilkan:

2645654 menit

Yang merupakan jumlah menit aktual yang telah berlalu antara kedua tanggal. Kelas DateTime akan mengambil daylight saving (tergantung pada zona waktu) ke akun di mana "cara lama" tidak akan. Baca manual tentang Tanggal dan Waktu http://www.php.net/manual/en/book.datetime.php

mike
sumber
12
Pitty DateInterval tidak memiliki metode seperti inSeconds()atau sesuatu yang serupa, sekarang pengulangan kode di mana-mana saya perlu menghitung perbedaan dalam hitungan detik.
Marius Balčytis
5
@ Barius Atau Anda dapat menulis fungsi yang membungkus kode berulang, atau bahkan memperpanjang DateTime dan tidak mengulangi kode Anda.
Anther
17
Memberi +1 untuk satu-satunya jawaban yang tepat pada saat menulis komentar ini.
NB
8
Menggunakan kelas DateTime baru itu baik, tetapi mengapa menghasilkan DateInterval yang kemudian harus diterjemahkan dengan canggung? $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
Dapatkah seseorang menjelaskan kepada saya mengapa ini lebih baik daripada strtotimejawaban di atasnya? Ini tampak seperti kasus OOP ketika Prosedural paling tidak sebagai solusi yang valid (dan jauh lebih ringkas).
Bing
341

Inilah jawabannya:

$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";
pengguna38526
sumber
4
fungsi abs () tidak diperlukan jika ada yang ingin memeriksa waktu negatif juga!
Pran
34
Bagi mereka yang bertanya-tanya, / 60,2artinya: bagi dengan enam puluh, bulatkan ke dua tempat desimal terdekat.
Bing
3
strtotime tidak bisa diandalkan, hindari. Hanya berfungsi untuk format tanggal tertentu, sebagian besar yang terkait dengan AS.
sivann
14
strtotimemungkin sudah usang tetapi tidak dapat diandalkan jika Anda menggunakannya dengan benar. Masuk akal bahwa Anda harus bekerja dengan format tanggal yang konsisten untuk dapat membaca (atau mengurai) tanggal dengan benar. Lihat ISO 8601dan jangan salahkan alat: =)
Phil
34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>
Tom
sumber
1
Ini sangat rapi dan cukup jelas tidak seperti gunk di atas.
TheRealChx101
Bisakah Anda menjelaskan mengapa Anda perlu sleepmenghitung selisih tanggal?
Nico Haase
2
Apa cara yang lebih baik untuk menggunakan waktu Anda sambil menunggu waktu lain untuk dibandingkan daripada tidur sebentar. walaupun secara teori ini seharusnya memberi Anda jawaban 2, yang dapat membantu orang yang mencoba memahami formula, membenarkan itu benar.
slappy-x
15

Ini bekerja pada program saya, saya menggunakan date_diff, Anda dapat memeriksa date_diffmanual di sini .

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

Anda mendapatkan hasil apa yang Anda inginkan.

Yussan
sumber
1
Aneh, bagi saya, mengeksekusi kode itu tidak memberikan perbedaan waktu dalam hitungan menit
Nico Haase
Ini berguna hanya jika Anda ingin menampilkan "1 jam 14 menit". Jika Anda hanya ingin menit, misalnya), Anda harus menghitung: ($ diff-> h * 60) + $ diff-> i)
GDP
13

cara lain dengan zona waktu.

$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);
Muhammad
sumber
4
Jika Anda ingin berhari-hari juga, daripada yang Anda tambahkan $days = $interval->format('%d');dan perbedaannya adalah ($days * 1440 + $hours * 60 + $minutes). Selama berbulan-bulan, tahun => logika yang sama
Pelihat
12

Saya menulis fungsi ini untuk satu situs blog saya (perbedaan antara tanggal yang lalu dan tanggal server). Ini akan memberi Anda output seperti ini

"49 detik yang lalu", "20 menit yang lalu", "21 jam yang lalu" dan seterusnya

Saya telah menggunakan fungsi yang akan memberi saya perbedaan antara tanggal yang dilewati dan tanggal server.

<?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";
   }

}
?>

Simpan sebagai file misalkan "date.php". Panggil fungsi dari halaman lain seperti ini

<?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);
?>

Tentu saja Anda dapat memodifikasi fungsi untuk memberikan dua nilai.

Raj Sharma
sumber
10

Saya pikir ini akan membantu Anda

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;
}
Yubraj Pokharel
sumber
Silakan tambahkan beberapa penjelasan ke kode Anda sehingga OP dapat belajar darinya
Nico Haase
Untuk beberapa menit$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";
        }
}
Veerendra
sumber
8

Versi yang lebih universal yang mengembalikan hasil dalam hitungan hari, jam, menit atau detik termasuk pecahan / desimal:

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
bergulat
sumber
Silakan tambahkan beberapa penjelasan ke kode Anda sehingga OP dapat belajar darinya
Nico Haase
7

Ini adalah bagaimana saya menampilkan "xx times ago" di php> 5.2 .. di sini ada info lebih lanjut tentang objek 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;
}
hriziya
sumber
7
<?php
$start = strtotime('12:01:00');
$end = strtotime('13:16:00');
$mins = ($end - $start) / 60;
echo $mins;
?>

Keluaran:

75
Rahilkhan Pathan
sumber
3

Kurangi waktu dan bagi dengan 60.

Berikut adalah contoh yang menghitung waktu yang berlalu dari 2019/02/01 10:23:45dalam menit:

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

Solusi saya untuk menemukan perbedaan antara dua tanggal ada di sini. Dengan fungsi ini Anda dapat menemukan perbedaan seperti detik, menit, jam, hari, tahun dan bulan.

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;
 }
}

Anda dapat mengembangkan fungsi ini. Saya menguji dan bekerja untuk saya. Output objek DateInterval ada di sini:

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

Penggunaan fungsi:

$ date = tanggal yang lalu, $ diff = type mis: "menit", "hari", "detik"

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

Semoga berhasil.

Ali
sumber
0

Ini akan membantu....

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;     
}
GYaN
sumber
1
Silakan tambahkan beberapa penjelasan ke kode Anda sehingga OP dapat belajar darinya
Nico Haase
0

Saya menemukan banyak solusi tetapi saya tidak pernah mendapatkan solusi yang benar. Tetapi saya telah membuat beberapa kode untuk menemukan menit, silakan periksa.

<?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;
?>

Ini memberikan output dalam jam dan menit misalnya 01 jam 02 menit seperti 01:02

Sumit Kumar Gupta
sumber