Come ottenere la differenza di tempo in minuti in PHP


Risposte:


92

Sottrai il più uno dal futuro più uno e dividi per 60.

I tempi sono fatti in formato Unix, quindi sono solo un grande numero che mostra il numero di secondi da January 1, 1970, 00:00:00 GMT


1
@Jerald Come funziona questa soluzione per te? Ti dispiace informarlo almeno un po '? Grazie.
Wafie Ali,

7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); questo restituirà la differenza di tempo in secondi, quindi puoi semplicemente dividere per 60 in questo modo. $ nInterval = $ nInterval / 60;
Jerald,

+1 per spiegare cosa deve essere fatto e non usare l'inutile classe DateInterval che non ha un metodo per farlo: restituire la differenza in minuti .
AndreKR,

404

Le risposte sopra sono per le versioni precedenti di PHP. Usa la classe DateTime per fare qualsiasi calcolo di data ora che PHP 5.3 è la norma. Per esempio.

$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 è un oggetto DateInterval . Nota che la proprietà days è disponibile (perché abbiamo usato il metodo diff della classe DateTime per generare l'oggetto DateInterval).

Il codice sopra riportato produrrà:

1837 giorni totali
5 anni
0 mesi
10 giorni
6 ore
14 minuti
2 secondi

Per ottenere il numero totale di minuti:

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

Questo produrrà:

2645654 minuti

Qual è il numero effettivo di minuti trascorsi tra le due date. La classe DateTime prenderà in considerazione l'ora legale (a seconda del fuso orario), laddove il "vecchio modo" non lo farà. Leggi il manuale su Data e ora http://www.php.net/manual/en/book.datetime.php


12
Pitty DateInterval non ha un metodo simile inSeconds()o qualcosa di simile, ora è la ripetizione del codice ovunque ho bisogno di calcolare la differenza in secondi.
Marius Balčytis,

5
@barius Oppure puoi scrivere una funzione che avvolge il codice ripetuto, o anche estendere DateTime e non ripetere il tuo codice.
Anther,

17
+1 per l'unica risposta corretta al momento della stesura di questo commento.
NB

8
L'uso della nuova classe DateTime è buono, ma perché generare un DateInterval che deve quindi essere decodificato in modo così imbarazzante? $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
Qualcuno può spiegarmi perché questo è meglio della strtotimerisposta sopra di esso? Questo sembra un caso di OOP quando Procedural è ALMENO come soluzione valida (e considerevolmente più concisa).
Bing,

341

Ecco la risposta:

$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
La funzione abs () non è necessaria se qualcuno desidera controllare anche i tempi negativi!
Pran,

34
Per chi si chiede, il / 60,2mezzo: dividere per sessanta, arrotondare al secondo decimale più vicino.
Bing,

3
strtotime non è affidabile, evita. Funziona solo con formati di data specifici, principalmente relativi agli Stati Uniti.
sivann,

14
strtotimepotrebbe essere obsoleto ma non è inaffidabile se lo si utilizza correttamente. È ovvio che devi lavorare con formati di data coerenti per poter leggere (o analizzare) le date correttamente. Vedi ISO 8601e non dare la colpa agli strumenti: =)
Phil

34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>

1
Questo è molto accurato e autoesplicativo a differenza del gunk sopra.
TheRealChx101

Puoi spiegare perché ne hai bisogno sleepper calcolare una differenza di data?
Nico Haase,

2
Quale modo migliore di usare il tuo tempo in attesa di un altro momento di confronto rispetto a un sonno veloce. anche se questo dovrebbe in teoria darti una risposta di 2, che potrebbe aiutare le persone a cercare di capire la formula, confermando che è corretta.
slappy-x

15

Ha funzionato sui miei programmi, lo sto usando date_diff, puoi consultare il date_diffmanuale qui .

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

Ottieni risultati cosa vuoi.


1
Stranamente, per me, l'esecuzione di quel codice non fornisce la differenza di tempo in minuti
Nico Haase,

Ciò è utile solo se si desidera produrre "1hr 14mins". Se vuoi solo minuti, ad esempio), dovresti fare i conti: ($ diff-> h * 60) + $ diff-> i)
PIL

13

un altro modo con il fuso orario.

$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
Se vuoi anche i giorni di quelli che aggiungi $days = $interval->format('%d');e il diff è ($days * 1440 + $hours * 60 + $minutes). Per mesi, anni => stessa logica
veggente

12

Ho scritto questa funzione per un mio sito blog (differenza tra una data passata e la data del server). Ti darà un risultato come questo

"49 secondi fa", "20 minuti fa", "21 ore fa" e così via

Ho usato una funzione che mi farebbe la differenza tra la data passata e la data del 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";
   }

}
?>

Salvalo come file supponiamo "date.php". Chiama la funzione da un'altra pagina come questa

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

Naturalmente è possibile modificare la funzione per passare due valori.


10

Penso che questo ti aiuterà

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

Per favore aggiungi qualche spiegazione al tuo codice in modo che l'OP possa imparare da esso
Nico Haase,

Per minuti$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

Una versione più universale che restituisce il risultato in giorni, ore, minuti o secondi inclusi frazioni / decimali:

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

Per favore, aggiungi qualche spiegazione al tuo codice in modo che l'OP possa imparare da esso
Nico Haase,

7

Ecco come ho visualizzato "xx times ago" in php> 5.2 .. ecco maggiori informazioni sull'oggetto 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;
}

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

Produzione:

75

3

Sottrai i tempi e dividi per 60.

Ecco un esempio che calcola il tempo trascorso 2019/02/01 10:23:45in minuti:

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

2

La mia soluzione per trovare la differenza tra due date è qui. Con questa funzione puoi trovare differenze come secondi, minuti, ore, giorni, anni e mesi.

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

Puoi sviluppare questa funzione. Ho provato e lavora per me. L'output dell'oggetto DateInterval è qui:

/*
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 funzione:

$ date = la data passata, $ diff = tipo es: "minuti", "giorni", "secondi"

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

In bocca al lupo.


0

Questo aiuterà....

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
Per favore, aggiungi qualche spiegazione al tuo codice in modo che l'OP possa imparare da esso
Nico Haase,

0

Ho trovato così tante soluzioni ma non ho mai avuto la soluzione corretta. Ma ho creato un codice per trovare i minuti, per favore controlla.

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

Fornisce output in ore e minuti, ad esempio 01 ora 02 minuti come 01:02

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.