Comment obtenir le décalage horaire en minutes en PHP

270

Comment calculer la différence minute entre deux dates-heures en PHP?

Tomasz Smykowski
la source

Réponses:

92

Soustrayez le plus un passé du plus un futur et divisez par 60.

Les temps sont effectués au format Unix, ils ne sont donc qu'un grand nombre indiquant le nombre de secondes January 1, 1970, 00:00:00 GMT

Oli
la source
1
@Jerald Comment cette solution fonctionne-t-elle pour vous? Cela vous dérange-t-il de l'exposer au moins un peu? Merci.
Wafie Ali
7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); cela retournera la différence de temps en secondes, alors vous pouvez simplement diviser par 60 comme ceci. $ nInterval = $ nInterval / 60;
Jerald
+1 pour expliquer ce qui doit être fait et ne pas utiliser la classe DateInterval inutile qui n'a pas de méthode pour cela: renvoyer la différence en minutes .
AndreKR
404

Les réponses ci-dessus concernent les anciennes versions de PHP. Utilisez la classe DateTime pour effectuer des calculs de date maintenant que PHP 5.3 est la norme. Par exemple.

$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 est un objet DateInterval . Notez que la propriété days est disponible (car nous avons utilisé la méthode diff de la classe DateTime pour générer l'objet DateInterval).

Le code ci-dessus affichera:

1837 jours au total
5 ans
0 mois
10 jours
6 heures
14 minutes
2 secondes

Pour obtenir le nombre total de minutes:

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

Cela produira:

2645654 minutes

Quel est le nombre réel de minutes qui se sont écoulées entre les deux dates. La classe DateTime prendra en compte l'heure d'été (en fonction du fuseau horaire) là où «l'ancienne» ne le fera pas. Lisez le manuel sur la date et l'heure http://www.php.net/manual/en/book.datetime.php

Mike
la source
12
Pitty DateInterval n'a pas de méthode similaire inSeconds()ou quelque chose de similaire, maintenant c'est la répétition de code partout où j'ai besoin de calculer la différence en secondes.
Marius Balčytis
5
@barius Ou vous pouvez écrire une fonction qui encapsule le code répétitif, ou même étendre DateTime et ne pas répéter votre code.
Anther
17
+1 pour la seule bonne réponse au moment de la rédaction de ce commentaire.
NB
8
L'utilisation de la nouvelle classe DateTime est bonne, mais pourquoi générer un DateInterval qui doit ensuite être décodé si maladroitement? $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
Quelqu'un peut-il m'expliquer pourquoi c'est mieux que la strtotimeréponse ci-dessus? Cela semble être un cas de POO lorsque la procédure est AU MOINS une solution valide (et considérablement plus concise).
Bing
341

Voici la réponse:

$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
la source
4
La fonction abs () n'est pas requise si quelqu'un souhaite également vérifier le temps négatif!
Pran
34
Pour ceux qui se demandent, les / 60,2moyens: diviser par soixante, arrondir à la deuxième décimale la plus proche.
Bing
3
strtotime n'est pas fiable, évitez. Fonctionne uniquement pour des formats de date spécifiques, principalement liés aux États-Unis.
sivann
14
strtotimepeut être obsolète, mais il n'est pas fiable si vous l'utilisez correctement. Il va de soi que vous devez travailler avec des formats de date cohérents pour pouvoir lire (ou analyser) les dates correctement. Voir ISO 8601et ne pas blâmer les outils: =)
Phil
34
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>
À M
la source
1
C'est très net et explicite contrairement à la crasse ci-dessus.
TheRealChx101
Pouvez-vous expliquer pourquoi vous en avez besoin sleeppour calculer une différence de date?
Nico Haase
2
Quelle meilleure façon d'utiliser votre temps en attendant un autre temps que de dormir rapidement. bien que cela devrait en théorie vous donner une réponse de 2, ce qui pourrait aider les gens à essayer de comprendre la formule, confirmant qu'elle est correcte.
slappy-x
15

Cela a fonctionné sur mes programmes, j'utilise date_diff, vous pouvez consulter le date_diffmanuel ici .

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

Vous obtenez des résultats que voulez-vous.

yussan
la source
1
Étrange, pour moi, exécuter ce code ne fournit pas le décalage horaire en minutes
Nico Haase
Ceci n'est utile que si vous voulez sortir "1h 14mins". Si vous ne voulez que quelques minutes, par exemple), vous devrez faire le calcul: ($ diff-> h * 60) + $ diff-> i)
PIB
13

d'une autre manière avec le fuseau horaire.

$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
la source
4
Si vous voulez aussi des jours, alors vous ajoutez $days = $interval->format('%d');et le diff est ($days * 1440 + $hours * 60 + $minutes). Pendant des mois, années => même logique
Voyant
12

J'ai écrit cette fonction pour un site de mon blog (différence entre une date antérieure et la date du serveur). Il vous donnera une sortie comme celle-ci

"Il y a 49 secondes", "il y a 20 minutes", "il y a 21 heures" et ainsi de suite

J'ai utilisé une fonction qui me ferait la différence entre la date passée et la date du serveur.

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

}
?>

Enregistrez-le en tant que fichier supposons "date.php". Appelez la fonction à partir d'une autre page comme celle-ci

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

Bien sûr, vous pouvez modifier la fonction pour passer deux valeurs.

Raj Sharma
la source
10

Je crois que ceci vous aidera

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
la source
Veuillez ajouter quelques explications à votre code afin que l'OP puisse en tirer des leçons
Nico Haase
Pour quelques minutes$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
la source
8

Une version plus universelle qui renvoie le résultat en jours, heures, minutes ou secondes, y compris les fractions / décimales:

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
soit simple
la source
Veuillez ajouter quelques explications à votre code afin que le PO puisse en tirer des enseignements
Nico Haase
7

C'est ainsi que j'ai affiché "il y a xx fois" dans php> 5.2 .. voici plus d'informations sur l' objet 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
la source
7
<?php
$start = strtotime('12:01:00');
$end = strtotime('13:16:00');
$mins = ($end - $start) / 60;
echo $mins;
?>

Production:

75
Rahilkhan Pathan
la source
3

Soustrayez les temps et divisez par 60.

Voici un exemple qui calcule le temps écoulé à partir de 2019/02/01 10:23:45en minutes:

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

Ma solution pour trouver la différence entre deux dates est ici. Avec cette fonction, vous pouvez trouver des différences comme les secondes, les minutes, les heures, les jours, les années et les mois.

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

Vous pouvez développer cette fonction. J'ai testé et travaille pour moi. La sortie de l'objet DateInterval est ici:

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

Utilisation de la fonction:

$ date = la date passée, $ diff = type par exemple: "minutes", "jours", "secondes"

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

Bonne chance.

Ali
la source
0

CA aidera....

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
la source
1
Veuillez ajouter quelques explications à votre code afin que le PO puisse en tirer des enseignements
Nico Haase
0

J'ai trouvé tellement de solutions mais je n'ai jamais eu de solution correcte. Mais j'ai créé du code pour trouver des minutes, veuillez le vérifier.

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

Il donne la sortie en heures et minutes par exemple 01 heure 02 minutes comme 01:02

Sumit Kumar Gupta
la source