Jak uzyskać różnicę czasu w minutach w PHP

269

Jak obliczyć różnicę minut między dwiema datami w PHP?

Tomasz Smykowski
źródło

Odpowiedzi:

92

Odejmij przeszłość najbardziej od przyszłej najbardziej i podziel przez 60.

Czasy są wykonywane w formacie Unix, więc są tylko dużą liczbą pokazującą liczbę sekund od January 1, 1970, 00:00:00 GMT

Oli
źródło
1
@Jerald Jak to rozwiązanie działa dla Ciebie? Czy masz ochotę chociaż krótko to streścić? Dzięki.
Wafie Ali
7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); to zwróci różnicę czasu w sekundach, wtedy możesz po prostu podzielić przez 60 w ten sposób. $ nInterval = $ nInterval / 60;
Jerald
+1 za wyjaśnienie, co należy zrobić i nieużywanie bezużytecznej klasy DateInterval, która nie ma metody, aby to zrobić: zwróć różnicę w minutach .
AndreKR
404

Powyższe odpowiedzi dotyczą starszych wersji PHP. Użyj klasy DateTime, aby wykonać obliczenia daty teraz, gdy PHP 5.3 jest normą. Na przykład.

$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 jest obiektem DateInterval . Zauważ, że właściwość days jest dostępna (ponieważ użyliśmy metody diff klasy DateTime do wygenerowania obiektu DateInterval).

Powyższy kod wyświetli:

1837 dni łącznie
5 lat
0 miesięcy
10 dni
6 godzin
14 minut
2 sekund

Aby uzyskać całkowitą liczbę minut:

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

Spowoduje to wygenerowanie:

2645654 minuty

To jest faktyczna liczba minut, które upłynęły między dwiema datami. Klasa DateTime weźmie pod uwagę czas letni (w zależności od strefy czasowej) tam, gdzie „stary sposób” nie. Przeczytaj instrukcję dotyczącą daty i godziny http://www.php.net/manual/en/book.datetime.php

mikrofon
źródło
12
Pitty DateInterval nie ma metody podobnej inSeconds()ani podobnej, teraz jest to powtarzanie kodu wszędzie, gdzie muszę obliczyć różnicę w sekundach.
Marius Balčytis
5
@barius Możesz też napisać funkcję, która otacza powtarzający się kod, a nawet wydłużyć DateTime i nie powtarzać kodu.
Anther
17
+1 za jedyną prawidłową odpowiedź w momencie pisania tego komentarza.
NB
8
Korzystanie z nowej klasy DateTime jest dobre, ale po co generować DateInterval, który następnie musi być tak niezgrabnie dekodowany? $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
Czy ktoś może mi wyjaśnić, dlaczego jest to lepsze niż strtotimepowyższa odpowiedź? Wydaje się, że jest to przypadek OOP, gdy procedura jest co najmniej jako prawidłowe (i znacznie bardziej zwięzłe) rozwiązanie.
Bing,
341

Oto odpowiedź:

$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";
użytkownik38526
źródło
4
funkcja abs () nie jest wymagana, jeśli ktoś chce sprawdzić czas ujemny!
Pran,
34
Dla tych, którzy zastanawiają się, / 60,2oznacza to: podziel przez sześćdziesiąt, zaokrąglając do najbliższych dwóch miejsc po przecinku.
Bing,
3
strtotime jest zawodny, unikaj. Działa tylko w przypadku określonych formatów dat, głównie związanych z USA.
sivann
14
strtotimemoże być przestarzałe, ale nie jest zawodne, jeśli używasz go poprawnie. Jest oczywiste, że musisz pracować ze spójnymi formatami dat, aby móc poprawnie odczytać (lub parsować) daty. Zobacz ISO 8601i nie obwiniaj narzędzi: =)
Phil
34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>
Tomek
źródło
1
Jest to bardzo schludne i zrozumiałe w przeciwieństwie do gunka powyżej.
TheRealChx101
Czy możesz wyjaśnić, dlaczego potrzebujesz sleepobliczenia różnicy dat?
Nico Haase
2
Czy jest lepszy sposób na wykorzystanie czasu podczas oczekiwania na inny czas niż na szybki sen. chociaż teoretycznie powinno to dać odpowiedź na 2, co może pomóc osobom próbującym zrozumieć formułę, potwierdzając jej poprawność.
slappy-x
15

Działa w moich programach, używam date_diff, możesz sprawdzić date_diffinstrukcję tutaj .

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

Otrzymujesz wyniki, czego chcesz.

Yussan
źródło
1
Dziwne, jak dla mnie, wykonanie tego kodu nie zapewnia różnicy czasu w minutach
Nico Haase
Jest to przydatne tylko wtedy, gdy chcesz wyprowadzić „1 godzinę 14 minut”. Jeśli chcesz na przykład tylko minuty), musisz wykonać obliczenia matematyczne: ($ diff-> h * 60) + $ diff-> i)
PKB
13

inny sposób ze strefą czasową.

$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);
Mahomet
źródło
4
Jeśli chcesz też dni, niż dodajesz, $days = $interval->format('%d');a różnica jest ($days * 1440 + $hours * 60 + $minutes). Przez miesiące lata => ta sama logika
Widzicie
12

Napisałem tę funkcję na jednym z moich blogów (różnica między datą przeszłą a datą serwera). To da ci takie wyjście

„49 sekund temu”, „20 minut temu”, „21 godzin temu” i tak dalej

Użyłem funkcji, która dałaby mi różnicę między datą przejścia a datą serwera.

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

}
?>

Zapisz go jako plik, załóżmy, że „date.php”. Wywołaj funkcję z innej strony takiej jak ta

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

Oczywiście możesz zmodyfikować funkcję, aby przekazać dwie wartości.

Raj Sharma
źródło
10

Myślę, że to ci pomoże

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
źródło
Dodaj wyjaśnienie do swojego kodu, aby OP mógł się z niego uczyć
Nico Haase
Przez minuty$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
źródło
8

Bardziej uniwersalna wersja zwracająca wynik w dniach, godzinach, minutach lub sekundach, w tym ułamki zwykłe / dziesiętne:

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
besimple
źródło
Dodaj wyjaśnienie do swojego kodu, aby OP mógł się z niego uczyć
Nico Haase
7

Oto jak wyświetlałem „xx razy temu” w php> 5.2. Oto więcej informacji o obiekcie 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
źródło
6
<?php
$start = strtotime('12:01:00');
$end = strtotime('13:16:00');
$mins = ($end - $start) / 60;
echo $mins;
?>

Wynik:

75
Rahilkhan Pathan
źródło
3

Odejmij czasy i podziel przez 60.

Oto przykład, który oblicza upływ czasu 2019/02/01 10:23:45w minutach:

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

Moje rozwiązanie, aby znaleźć różnicę między dwiema datami, jest tutaj. Dzięki tej funkcji możesz znaleźć różnice, takie jak sekundy, minuty, godziny, dni, lata i miesiące.

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

Możesz rozwinąć tę funkcję. Testowałem i działa dla mnie. Dane wyjściowe obiektu DateInterval są tutaj:

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

Zastosowanie funkcji:

$ date = data z przeszłości, $ diff = typ np .: „minuty”, „dni”, „sekundy”

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

Powodzenia.

Ali
źródło
0

To pomoże....

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;     
}
DZIECKO
źródło
1
Dodaj wyjaśnienie do swojego kodu, aby OP mógł się z niego uczyć
Nico Haase
0

Znalazłem tak wiele rozwiązań, ale nigdy nie znalazłem właściwego rozwiązania. Ale stworzyłem kod, aby znaleźć minuty, sprawdź to.

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

Daje wynik w godzinach i minutach, na przykład 01 godzina 02 minut jak 01:02

Sumit Kumar Gupta
źródło