Cómo obtener la diferencia horaria en minutos en PHP

270

¿Cómo calcular la diferencia de minutos entre dos fechas y horas en PHP?

Tomasz Smykowski
fuente

Respuestas:

92

Resta el pasado más uno del futuro más uno y divide entre 60.

Los tiempos se realizan en formato Unix, por lo que son solo un gran número que muestra la cantidad de segundos January 1, 1970, 00:00:00 GMT

Oli
fuente
1
@Jerald ¿Cómo funciona esta solución para usted? ¿Te importaría informarlo al menos un poco? Gracias.
Wafie Ali
77
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); esto devolverá la diferencia de tiempo en segundos, luego puede dividir entre 60 de esta manera. $ nInterval = $ nInterval / 60;
Jerald
+1 para explicar lo que hay que hacer y no usar la clase DateInterval inútil que no tiene un método para hacer eso: devolver la diferencia en minutos .
AndreKR
404

Las respuestas anteriores son para versiones anteriores de PHP. Use la clase DateTime para hacer cualquier cálculo de fecha ahora que PHP 5.3 es la norma. P.ej.

$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 es un objeto DateInterval . Tenga en cuenta que la propiedad days está disponible (porque usamos el método diff de la clase DateTime para generar el objeto DateInterval).

El código anterior generará:

1837 días en total
5 años
0 meses
10 días
6 horas
14 minutos
2 segundos

Para obtener el número total de minutos:

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

Esto generará:

2645654 minutos

Cuál es el número real de minutos que han pasado entre las dos fechas. La clase DateTime tendrá en cuenta el horario de verano (dependiendo de la zona horaria) donde la "forma antigua" no lo hará. Lea el manual sobre Fecha y hora http://www.php.net/manual/en/book.datetime.php

Miguel
fuente
12
Pitty DateInterval no tiene un método similar inSeconds()o similar, ahora es repetición de código en todas partes donde necesito calcular la diferencia en segundos.
Marius Balčytis
55
@barius O puede escribir una función que envuelva el código repetido, o incluso extender DateTime y no repetir su código.
Antera
17
+1 para la única respuesta correcta al momento de escribir este comentario.
NB
8
Usar la nueva clase DateTime es bueno, pero ¿por qué generar un DateInterval que luego debe decodificarse de manera tan incómoda? $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
¿Alguien puede explicarme por qué esto es mejor que la strtotimerespuesta anterior? Este parece ser un caso de OOP cuando el procedimiento es AL MENOS como una solución válida (y considerablemente más concisa).
Bing
341

Aquí está la respuesta:

$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";
usuario38526
fuente
44
¡La función abs () no es necesaria si alguien desea verificar el tiempo negativo también!
Pran
34
Para aquellos que se preguntan, los / 60,2medios: dividir entre sesenta, redondear a los dos decimales más cercanos.
Bing
3
Strtotime no es confiable, evítelo. Solo funciona para formatos de fecha específicos, principalmente relacionados con EE. UU.
sivann
14
strtotimepuede ser obsoleto pero no es poco confiable si lo usa correctamente. Es lógico que necesite trabajar con formatos de fecha consistentes para poder leer (o analizar) las fechas correctamente. Mira ISO 8601y no culpes a las herramientas: =)
Phil
34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>
Tom
fuente
1
Esto es muy ordenado y se explica por sí mismo a diferencia de la suciedad de arriba.
TheRealChx101
¿Puedes explicar por qué necesitas un poco sleeppara calcular la diferencia de fecha?
Nico Haase
2
¿Qué mejor manera de usar su tiempo mientras espera otro momento para comparar que tener un sueño rápido? aunque esto debería en teoría darte una respuesta de 2, lo que podría ayudar a las personas que intentan entender la fórmula, confirmando que es correcta.
slappy-x
15

Funcionó en mis programas, estoy usando date_diff, puedes consultar el date_diffmanual aquí .

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

Obtienes resultados de lo que quieres.

yussan
fuente
1
Extraño, para mí, ejecutar ese código no proporciona la diferencia horaria en minutos
Nico Haase
Esto es útil solo si desea generar "1 hora y 14 minutos". Si solo desea minutos, por ejemplo), tendría que hacer los cálculos: ($ diff-> h * 60) + $ diff-> i)
PIB
13

Otra forma con la zona horaria.

$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);
Mahoma
fuente
44
Si también quiere días, entonces agrega $days = $interval->format('%d');y la diferencia es ($days * 1440 + $hours * 60 + $minutes). Por meses, años => misma lógica
Vidente
12

Escribí esta función para uno mi sitio de blog (diferencia entre una fecha pasada y la fecha del servidor). Te dará una salida como esta

"Hace 49 segundos", "Hace 20 minutos", "Hace 21 horas", etc.

He usado una función que me daría la diferencia entre la fecha pasada y la fecha del servidor.

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

}
?>

Guárdelo como un archivo suponga "date.php". Llame a la función desde otra página como esta

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

Por supuesto, puede modificar la función para pasar dos valores.

Raj Sharma
fuente
10

Creo que esto te ayudará

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
fuente
Agregue alguna explicación a su código para que el OP pueda aprender de él
Nico Haase,
Por minutos$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
fuente
8

Una versión más universal que devuelve resultados en días, horas, minutos o segundos, incluidas fracciones / decimales:

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
ser simple
fuente
Agregue alguna explicación a su código para que el OP pueda aprender de él
Nico Haase,
7

Así es como mostré "xx times ago" en php> 5.2 ... aquí hay más información sobre el objeto 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
fuente
7
<?php
$start = strtotime('12:01:00');
$end = strtotime('13:16:00');
$mins = ($end - $start) / 60;
echo $mins;
?>

Salida:

75
Rahilkhan Pathan
fuente
3

Resta los tiempos y divide entre 60.

Aquí hay un ejemplo que calcula el tiempo transcurrido 2019/02/01 10:23:45en minutos:

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

Mi solución para encontrar la diferencia entre dos fechas está aquí. Con esta función puede encontrar diferencias como segundos, minutos, horas, días, años y meses.

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

Puedes desarrollar esta función. Lo probé y funciona para mí. La salida del objeto DateInterval está aquí:

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

Uso de la función:

$ date = la fecha pasada, $ diff = tipo, por ejemplo: "minutos", "días", "segundos"

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

Buena suerte.

Ali
fuente
0

Esto ayudará....

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
fuente
1
Agregue alguna explicación a su código para que el OP pueda aprender de él
Nico Haase,
0

Encontré muchas soluciones pero nunca obtuve la solución correcta. Pero he creado un código para encontrar minutos, compruébalo.

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

Da salida en horas y minutos, por ejemplo 01 hora 02 minutos como 01:02

Sumit Kumar Gupta
fuente