Як отримати різницю в хвилинах в PHP


Відповіді:


92

Відніміть минулу більшу частину від майбутньої самої і розділіть на 60.

Часи проводяться у форматі Unix, тому вони просто велика кількість, що показує кількість секунд від January 1, 1970, 00:00:00 GMT


1
@Jerald Як це рішення працює для вас? Ви не хочете трохи розповісти це? Дякую.
Wafie Ali

7
@WafieAli $ nInterval = strtotime ($ sDate2) - strtotime ($ sDate1); це поверне різницю часу в секундах, тоді ви можете просто поділити на 60 так. $ nInterval = $ nInterval / 60;
Джеральд

+1 для пояснення того, що потрібно зробити, а не використання марного класу DateInterval, який не має методу зробити саме це: повернути різницю в хвилинах .
AndreKR

404

Відповіді вище для старих версій PHP. Використовуйте клас DateTime для будь-яких обчислень дати, коли PHP 5.3 є нормою. Напр.

$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 - об'єкт DateInterval . Зауважте, що властивість днів доступна (оскільки ми використовували метод diff класу DateTime для створення об'єкта DateInterval).

Вищенаведений код виведе:

1837 днів всього
5 років
0 місяців
10 днів
6 годин
14 хвилин
2 секунди

Щоб отримати загальну кількість хвилин:

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

Це виведе:

2645654 хв

Яка фактична кількість хвилин, що пройшли між двома датами. Клас DateTime враховує літній час (залежно від часового поясу), де "старий спосіб" не буде. Прочитайте посібник про дату та час http://www.php.net/manual/en/book.datetime.php


12
У Pitty DateInterval немає такого способу, як inSeconds()чи щось подібне, тепер це повторення коду скрізь, де мені потрібно обчислити різницю в секундах.
Маріус Балчітіс

5
@barius Або ви можете написати функцію, яка обертає повторюваний код, або навіть продовжує DateTime і не повторює ваш код.
Антер

17
+1 за єдину правильну відповідь під час написання цього коментаря.
NB

8
Використання нового класу DateTime добре, але навіщо генерувати DateInterval, який потім потрібно декодувати так незручно? $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
Чи може хтось мені пояснити, чому це краще, ніж strtotimeвідповідь над ним? Це виглядає як випадок OOP, коли Процедур є НАЙКРАЩИМИ як вірне (і значно більш стисле) рішення.
Бінг

341

Ось відповідь:

$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
abs () функція не потрібна, якщо хтось теж хоче перевірити негативний час!
Прань

34
Для тих, хто цікавиться, / 60,2означає: розділити на шістдесят, округлити до найближчих двох знаків після коми.
Бінг

3
strtotime ненадійний, уникайте. Працює лише для певних форматів дати, переважно стосується США.
sivann

14
strtotimeможе бути застарілим, але це ненадійно, якщо ви ним правильно користуєтеся. Цілком зрозуміло, що вам потрібно працювати з послідовними форматами дат, щоб мати можливість читати (чи аналізувати) дати правильно. Побачте ISO 8601і не звинувачуйте інструменти: =)
Філ

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

1
Це дуже акуратно і зрозуміло, на відміну від вищезгаданої скарбниці.
TheRealChx101

Чи можете ви пояснити, чому вам потрібно дещо sleepдля розрахунку різниці в датах?
Ніко Хааз

2
Який кращий спосіб використати свій час, очікуючи на інший час порівняння, ніж швидкий сон. хоча це теоретично повинно дати вам відповідь 2, яка могла б допомогти людям, які намагаються зрозуміти формулу, підтвердивши її правильність.
slappy-x

15

Це працювало над моїми програмами, я використовую date_diff, ви можете перевірити date_diffкерівництво тут .

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

Ви отримуєте результати, що хочете.


1
Дивно, для мене виконання цього коду не передбачає різниці в хвилинах
Ніко Хааз,

Це корисно лише в тому випадку, якщо ви хочете вивести "1хр 14хв". Якщо вам потрібні лише хвилини, наприклад), вам доведеться робити математику: ($ diff-> h * 60) + $ diff-> i)
ВВП

13

інший спосіб із часовим поясом.

$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
Якщо ви хочете і днів, ніж ви додаєте, $days = $interval->format('%d');і різниця є ($days * 1440 + $hours * 60 + $minutes). Місяцями, роками => одна і та ж логіка
провидник

12

Я написав цю функцію для одного свого сайту блогу (різниця між минулою датою та датою сервера). Це дасть вам такий вихід

"49 секунд тому", "20 хвилин тому", "21 годину тому" тощо

Я використав функцію, яка дозволила б мені змінити дату проходження та дату сервера.

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

}
?>

Збережіть його як файл, припустимо, "date.php". Викличте функцію з іншої сторінки, як ця

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

Звичайно, ви можете змінити функцію для передачі двох значень.


10

Я думаю, що це вам допоможе

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

Будь ласка, додайте до свого коду трохи пояснень, щоб ОП
Ніко Хааз

На хвилини$minutes = floor(($seconds/60)%60);
Аравінд Гопі

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

Більш універсальна версія, яка повертає результат за днями, годинами, хвилинами чи секундами, включаючи дроби / десяткові дроби:

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

Будь ласка, додайте до свого коду трохи пояснень, щоб ОП може дізнатися на цьому
Ніко Хааз,

7

Ось так я відобразив "xx разів тому" в php> 5.2 .. тут є додаткова інформація про об'єкт 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;
}


3

Віднімаємо часи і ділимо на 60.

Ось приклад, який обчислює минулий час 2019/02/01 10:23:45у хвилинах:

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

2

Моє рішення знайти різницю між двома датами тут. За допомогою цієї функції ви можете знайти відмінності, такі як секунди, хвилини, години, дні, роки та місяці.

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

Ви можете розвинути цю функцію. Я тестував і працює для мене. Вихід об'єкта DateInterval знаходиться тут:

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

Використання функції:

$ date = минула дата, $ diff = тип, наприклад: "хвилини", "дні", "секунди"

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

Щасти.


0

Це допоможе….

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
Будь ласка, додайте до свого коду трохи пояснень, щоб ОП може дізнатися на цьому
Ніко Хааз,

0

Я знайшов так багато рішення, але ніколи не знайшов правильного рішення. Але я створив якийсь код, щоб знайти хвилини, будь ласка, перевірте його.

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

Це дає вихід у годинах і хвилинах, наприклад, 01:00 02 хвилин, як 01:02

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.