Как узнать разницу во времени в минутах в PHP

Как рассчитать минутную разницу между двумя датами в PHP?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
298
0
611 212
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Ответ принят как подходящий

Вычтите наибольшее число в прошлом из наибольшего числа в будущем и разделите на 60.

Время указывается в формате Unix, поэтому это просто большое число, показывающее количество секунд из January 1, 1970, 00:00:00 GMT.

@Jerald Как это решение работает для вас? Не могли бы вы его хоть немного проинформировать? Спасибо.

Wafie Ali 29.03.2017 04:59

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

Jerald 11.07.2017 13:27

+1 за объяснение того, что нужно сделать, и отказ от использования бесполезного класса DateInterval, у которого нет метода для этого: вернуть разницу в считанные минуты.

AndreKR 10.06.2019 22:47

Вот ответ:

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

Функция abs () не требуется, если кто-то тоже хочет проверить отрицательное время!

Pran 12.12.2015 09:09

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

Bing 25.07.2016 08:09

strtotime ненадежен, избегайте. Работает только для определенных форматов даты, в основном связанных с США.

sivann 26.09.2016 18:06
strtotime может быть устаревшим, но при правильном использовании он не является ненадежным. Само собой разумеется, что вам нужно работать с согласованными форматами даты, чтобы иметь возможность правильно читать (или анализировать) даты. Смотрите ISO 8601 и не вините инструменты: =)
Phil 05.10.2016 00:29
<?php
$date1 = time();
sleep(2000);
$date2 = time();
$mins = ($date2 - $date1) / 60;
echo $mins;
?>

Вы можете объяснить, зачем вам нужен sleep для расчета разницы в датах?

Nico Haase 01.02.2019 11:55

Какой лучший способ использовать свое время в ожидании другого времени для сравнения, чем быстрый сон. хотя теоретически это должно дать вам ответ 2, что может помочь людям, пытающимся понять формулу, подтверждая ее правильность.

slappy-x 06.02.2019 02:59

Приведенные выше ответы относятся к более старым версиям PHP. Теперь, когда PHP 5.3 стал нормой, используйте класс DateTime для любых вычислений даты. Например.

$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. Обратите внимание, что свойство days доступно (потому что мы использовали метод 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

Pitty DateInterval не имеет метода типа inSeconds() или чего-то подобного, теперь это повторение кода везде, где мне нужно вычислить разницу в секундах.

Marius Balčytis 29.11.2012 11:32

@barius Или вы можете написать функцию, которая обертывает повторяющийся код, или даже расширить DateTime и не повторять ваш код.

Anther 16.04.2013 21:41

+1 за единственный правильный ответ на момент написания этого комментария.

N.B. 11.07.2013 16:49

Использование нового класса 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 15.12.2014 01:43

@dkloke: потому что это будет использовать классическую временную метку unix, что означает, что мы должны иметь дело с датами до 1970 года, високосными годами и т. д. самостоятельно.

Hafenkranich 17.05.2015 01:42

@Raphael Weber, это верно для некоторых более ранних версий, я пробовал это в 5.3.15 и последующих версиях, и getTimestamp () дает отрицательные числа для DateTimes до эпохи unix и, следовательно, правильные вычисления; Я проверил несколько тривиальных примеров високосного года до эпохи, и расчеты оказались правильными. Но это зависит от версии, примечание пользователя в разделе DateTime: getTimestamp предполагает, что использование format("U") более надежно для версии, которая возвращает false для getTimestamp ().

dkloke 17.05.2015 10:49

Может кто-нибудь объяснить мне, почему это лучше, чем ответ strtotime выше? Это похоже на случай ООП, когда Procedural НАИМЕНЕЕ является действительным (и значительно более кратким) решением.

Bing 25.07.2016 08:05

Как узнать, разница в плюсе или минусе?

m.qayyum 29.07.2016 23:41

«Старый способ» делает учитывает переход на летнее время и часовые пояса, поэтому я не вижу никаких полезных преимуществ использования DateTime в этой ситуации. @Hafenkranich Было бы ужасно, если бы високосные годы могли исказить временную метку unix. К счастью, они подумали об этом.

Phil 05.10.2016 00:56

@ Phil_1984_ правда. Наверное, в тот день не хватило кофе. Тем не менее, я бы предпочел придерживаться DateTime и никогда не смешивать использование этих двух. Это просто упрощает ситуацию. Поэтому, даже если в этом конкретном случае использования нет необходимости, я бы обычно придерживался DateTime.

Hafenkranich 05.10.2016 17:24

Не каждый день имеет 24 часа, поэтому это решение фактически не учитывает переход на летнее время. У меня нет лучшего предложения: / Pity DateInterval не имеет методов для такого рода вещей.

ARW 06.05.2018 21:22

С таким же успехом вы можете отредактировать свой ответ «выше», потому что вы выигрываете с моим голосом и, надеюсь, скоро будете лидером :)

ii iml0sto1 14.05.2018 16:13

Я понял $minutes = $since_start->days * 24 * 60;, потому что в сутках 24 часа, а в часах 60 минут, totalNumberOfDays * 24 * 60 действительно дает нам общее количество минут. Но тогда почему мы очередной раз делаем $minutes += $since_start->h * 60; и $minutes += $since_start->i; в следующих двух строках?

Shy 05.11.2018 08:44

Хороший ответ Предлагаю добавить знак: (int)($interval->format('%R').$minutes);

nourhero 16.09.2020 05:27

другой способ с часовым поясом.

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

Если вам тоже нужны дни, тогда вы добавляете $days = $interval->format('%d');, а разница - ($days * 1440 + $hours * 60 + $minutes). Для месяцев, лет => та же логика

Seer 22.01.2014 15:01

Вот как я отобразил «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;
}

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

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

Конечно, вы можете изменить функцию, чтобы передать два значения.

Я думаю это поможет тебе

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

Пожалуйста, добавьте пояснение к вашему коду, чтобы OP мог извлечь из него уроки.

Nico Haase 01.02.2019 11:56

Для минут $minutes = floor(($seconds/60)%60);

Aravindh Gopi 29.05.2019 09:06
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";
        }
}

Он работал с моими программами, я использую 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);

Вы получаете то, чего хотите.

Странно, для меня выполнение этого кода не дает разницы во времени в минутах

Nico Haase 01.02.2019 11:56

Это полезно, только если вы хотите вывести «1 час 14 минут». Если вам нужны только минуты, например), вам нужно будет выполнить математику: ($ diff-> h * 60) + $ diff-> i)

GDP 10.01.2020 19:26

Более универсальная версия, которая возвращает результат в днях, часах, минутах или секундах, включая дроби / десятичные числа:

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

Пожалуйста, добавьте пояснение к вашему коду, чтобы OP мог извлечь из него уроки.

Nico Haase 01.02.2019 11:57

Это поможет....

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

Пожалуйста, добавьте пояснение к вашему коду, чтобы OP мог извлечь из него уроки.

Nico Haase 01.02.2019 11:57

Мое решение найти разницу между двумя датами здесь. С помощью этой функции вы можете найти разницу в секундах, минутах, часах, днях, годах и месяцах.

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 = type например: «минуты», «дни», «секунды»

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

Удачи.

Я нашел так много решений, но так и не нашел правильного. Но я создал код, чтобы найти минуты, пожалуйста, проверьте его.

<?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 час 02 минуты, например 01:02.

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

Выход:

75

Вычтите время и разделите на 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;
$date1=date_create("2020-03-15");
$date2=date_create("2020-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");

Для получения подробных описателей формата посетите связь.

Еще один простой способ посчитать разницу в минутах. Обратите внимание, что это образец для расчета в пределах 1-летнего диапазона. для более подробной информации нажмите здесь

$origin = new DateTime('2021-02-10 09:46:32');
$target = new DateTime('2021-02-11 09:46:32');
$interval = $origin->diff($target);
echo (($interval->format('%d')*24) + $interval->format('%h'))*60; //1440 (difference in minutes)

Другие вопросы по теме