So erhalten Sie Zeitunterschied in Minuten in PHP

268

Wie berechnet man die Minutendifferenz zwischen zwei Datums- und Uhrzeitangaben in PHP?

Tomasz Smykowski
quelle

Antworten:

92

Subtrahieren Sie die Vergangenheit am meisten von der Zukunft am meisten und dividieren Sie durch 60.

Die Zeiten werden im Unix-Format angegeben, sodass es sich nur um eine große Zahl handelt, die die Anzahl der Sekunden ab angibt January 1, 1970, 00:00:00 GMT

Oli
quelle
1
@Jerald Wie funktioniert diese Lösung für Sie? Haben Sie etwas dagegen, es zumindest ein wenig zu erläutern? Vielen Dank.
Wafie Ali
7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); Dies gibt den Zeitunterschied in Sekunden zurück, dann können Sie einfach durch 60 teilen. $ nInterval = $ nInterval / 60;
Jerald
+1, um zu erklären, was zu tun ist, und um nicht die nutzlose DateInterval-Klasse zu verwenden, für die es keine Methode gibt: Differenz in Minuten zurückgeben .
AndreKR
404

Die obigen Antworten gelten für ältere Versionen von PHP. Verwenden Sie die DateTime-Klasse, um Datumsberechnungen durchzuführen, da PHP 5.3 die Norm ist. Z.B.

$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 ist ein DateInterval- Objekt. Beachten Sie, dass die Eigenschaft days verfügbar ist (da wir die diff-Methode der DateTime-Klasse zum Generieren des DateInterval-Objekts verwendet haben).

Der obige Code wird ausgegeben:

1837 Tage insgesamt
5 Jahre
0 Monate
10 Tage
6 Stunden
14 Minuten
2 Sekunden

So erhalten Sie die Gesamtzahl der Minuten:

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

Dies wird Folgendes ausgeben:

2645654 Minuten

Welches ist die tatsächliche Anzahl von Minuten, die zwischen den beiden Daten vergangen sind. Die DateTime-Klasse berücksichtigt die Sommerzeit (abhängig von der Zeitzone), wo dies auf "alte Weise" nicht der Fall ist. Lesen Sie das Handbuch zu Datum und Uhrzeit http://www.php.net/manual/en/book.datetime.php

Mike
quelle
12
Pitty DateInterval hat keine Methode wie inSeconds()oder ähnliches, jetzt ist es Code-Wiederholung überall dort, wo ich die Differenz in Sekunden berechnen muss.
Marius Balčytis
5
@barius Oder Sie können eine Funktion schreiben, die den sich wiederholenden Code umschließt, oder sogar DateTime erweitern und Ihren Code nicht wiederholen.
Anther
17
+1 für die einzig richtige Antwort zum Zeitpunkt des Schreibens dieses Kommentars.
NB
8
Die Verwendung der neuen DateTime-Klasse ist gut, aber warum sollte ein DateInterval generiert werden, das dann so umständlich dekodiert werden muss? $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
Kann mir jemand erklären, warum dies besser ist als die strtotimeAntwort darüber? Dies scheint ein Fall von OOP zu sein, wenn das Verfahren MINDESTENS als gültige (und wesentlich präzisere) Lösung gilt.
Bing
341

Hier ist die Antwort:

$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";
user38526
quelle
4
abs () -Funktion nicht erforderlich, wenn jemand auch die negative Zeit überprüfen möchte!
Pran
34
Für diejenigen, die sich fragen, / 60,2bedeutet das: durch sechzig teilen, auf die nächsten zwei Dezimalstellen runden.
Bing
3
strtotime ist unzuverlässig, vermeiden. Funktioniert nur für bestimmte Datumsformate, hauptsächlich in den USA.
Sivann
14
strtotimemag veraltet sein, aber es ist nicht unzuverlässig, wenn Sie es richtig verwenden. Es liegt auf der Hand, dass Sie mit konsistenten Datumsformaten arbeiten müssen, um die Daten korrekt lesen (oder analysieren) zu können. Sehen Sie ISO 8601und beschuldigen Sie nicht die Werkzeuge: =)
Phil
34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>
Tom
quelle
1
Dies ist sehr ordentlich und selbsterklärend im Gegensatz zu dem oben genannten Gunk.
TheRealChx101
Können Sie erklären, warum Sie einige benötigen sleep, um eine Datumsdifferenz zu berechnen?
Nico Haase
2
Gibt es einen besseren Weg, um Ihre Zeit zu nutzen, während Sie auf eine andere Zeit warten, als einen kurzen Schlaf zu haben? obwohl dies theoretisch eine Antwort von 2 geben sollte, was Menschen helfen könnte, die versuchen, die Formel zu verstehen und zu bestätigen, dass sie korrekt ist.
Slappy-X
15

Es hat bei meinen Programmen funktioniert, ich benutze date_diff, Sie können das date_diffHandbuch hier überprüfen .

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

Sie erhalten Ergebnisse, was Sie wollen.

Yussan
quelle
1
Seltsam für mich ist die Ausführung dieses Codes nicht der Zeitunterschied in Minuten
Nico Haase
Dies ist nur nützlich, wenn Sie "1 Stunde 14 Minuten" ausgeben möchten. Wenn Sie zum Beispiel nur Minuten wollen, müssen Sie rechnen: ($ diff-> h * 60) + $ diff-> i)
BIP
13

ein anderer Weg mit Zeitzone.

$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
quelle
4
Wenn Sie auch Tage wollen, dann fügen Sie hinzu $days = $interval->format('%d');und der Unterschied ist ($days * 1440 + $hours * 60 + $minutes). Seit Monaten, Jahren => gleiche Logik
Seher
12

Ich habe diese Funktion für eine meiner Blog-Sites geschrieben (Unterschied zwischen einem vergangenen Datum und dem Datum des Servers). Sie erhalten eine solche Ausgabe

"Vor 49 Sekunden", "vor 20 Minuten", "vor 21 Stunden" und so weiter

Ich habe eine Funktion verwendet, mit der ich die Differenz zwischen dem übergebenen Datum und dem Datum des Servers ermitteln kann.

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

}
?>

Speichern Sie es als Datei, nehmen Sie "date.php" an. Rufen Sie die Funktion von einer anderen Seite wie dieser auf

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

Natürlich können Sie die Funktion so ändern, dass zwei Werte übergeben werden.

Raj Sharma
quelle
10

Ich denke, das wird dir helfen

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
quelle
Bitte fügen Sie Ihrem Code eine Erklärung hinzu, damit das OP daraus lernen kann
Nico Haase
Für Minuten$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
quelle
8

Eine universellere Version, die Ergebnisse in Tagen, Stunden, Minuten oder Sekunden einschließlich Brüchen / Dezimalstellen zurückgibt:

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
Sei einfach
quelle
Bitte fügen Sie Ihrem Code eine Erklärung hinzu, damit das OP daraus lernen kann
Nico Haase
7

So habe ich "vor xx mal" in PHP> 5.2 angezeigt. Hier finden Sie weitere Informationen zum DateTime- Objekt

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

Ausgabe:

75
Rahilkhan Pathan
quelle
3

Subtrahieren Sie die Zeiten und dividieren Sie durch 60.

Hier ist ein Beispiel, das die verstrichene Zeit 2019/02/01 10:23:45in Minuten berechnet :

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

Meine Lösung, um den Unterschied zwischen zwei Daten zu finden, ist hier. Mit dieser Funktion können Sie Unterschiede wie Sekunden, Minuten, Stunden, Tage, Jahre und Monate feststellen.

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

Sie können diese Funktion entwickeln. Ich habe getestet und arbeite für mich. Die Ausgabe des DateInterval-Objekts erfolgt hier:

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

Funktionsnutzung:

$ date = das vergangene Datum, $ diff = Typ zB: "Minuten", "Tage", "Sekunden"

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

Viel Glück.

Ali
quelle
0

Das wird helfen....

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
quelle
1
Bitte fügen Sie Ihrem Code eine Erklärung hinzu, damit das OP daraus lernen kann
Nico Haase
0

Ich habe so viele Lösungen gefunden, aber nie die richtige Lösung gefunden. Aber ich habe einen Code erstellt, um Minuten zu finden. Bitte überprüfen Sie ihn.

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

Es gibt eine Ausgabe in Stunden und Minuten, zum Beispiel 01 Stunde 02 Minuten wie 01:02

Sumit Kumar Gupta
quelle