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


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


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


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

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

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.


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

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.


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

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

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

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

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

Wynik:

75

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;

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.