PHP находит разницу между двумя датами

Я пытаюсь получить разницу между двумя датами и вернуть ее как datetime. Я нашел примеры с использованием diff но я не могу понять это правильно.

$timein = date("Y-m-d H:i:s");
$timeout = date("Y-m-d 20:00:00");
$totaltime = $timein->diff($timeout);

Однако $totaltime входит в мою БД 0000-00-00 00:00:00. Это потому, что я не форматирую свою переменную totaltime?

Ответ 1

Я не уверен, какой формат вы ищете в своей разнице, но здесь, как это сделать, используя DateTime

$datetime1 = new DateTime();
$datetime2 = new DateTime('2011-01-03 17:13:00');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds');
echo $elapsed;

Ответ 2

Вы можете просто использовать datetime diff и format для вычисления разницы.

<?php
$datetime1 = new DateTime('2009-10-11 12:12:00');
$datetime2 = new DateTime('2009-10-13 10:12:00');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%Y-%m-%d %H:%i:%s');
?>

Для получения дополнительной информации о формате DATETIME обратитесь: здесь
Вы можете изменить формат интервала так, как хотите.

Здесь - рабочий пример

P.S. Эти функции (diff() и format()) работает только s >= PHP 5.3.0

Ответ 3

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

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

$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00');  // change the millenium to see output difference
$diff = $datetime1->diff($datetime2);

// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: ",$diff->format('%y years %m months %d days %h hours %i minutes %s seconds'),"\n";

// Notice the impact when you change $datetime2 millenium from '1' to '2'
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n";  // only H does it right

$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));

echo '$detail array: ';
var_export($details);
echo "\n";

array_map(function($v,$k)
    use(&$r)
    {
        $r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT));
        if($k=='y' || $k=='m'){$r.="-";}
        elseif($k=='d'){$r.=" ";}
        elseif($k=='h' || $k=='i'){$r.=":";}
    },$details,array_keys($details)
);
echo "Valid format: ",$r; // now all components of datetime are properly padded

Вывод:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$detail array: array (
  'y' => 6,
  'm' => 3,
  'd' => 9,
  'h' => 1,
  'i' => 0,
  's' => 6,
)
Valid format: 0006-03-09 01:00:06

Теперь, чтобы объяснить мою подготовку значения даты и времени:

$details принимает объект diff и выводит его как массив. array_flip (['y', 'm', 'd', 'h', 'i', 's']) создает массив ключей, который будет использоваться для удаления всех нерелевантных ключей из (array)$diff с помощью array_intersect_key().

Затем, используя array_map(), мой метод выполняет итерацию каждого значения и ключа в $details, накладывает левую сторону на соответствующую длину с помощью 0 'и объединяет строку $r (result) с необходимыми разделителями для соответствия запрошенному формату datetime.

Ответ 4

Извините, мой предыдущий ответ был неверным. Если вы пытаетесь взять общее истекшее время между временем и таймаутом в формате y- md H: i: s, возьмите diff между тайм-аутом и временем при использовании объекта DateTime и отформатируйте его как '% y-% m-% d% H:% i:% s '.

Ответ 5

<?php
$val1 = '2014-04-10 11:34:09';
$val2 = '2015-04-10 10:56:15';
$result1 = (explode(' ', $val1)) ;
$result2 = (explode(' ', $val2)) ;
$date1= new DateTime($result1[0]);
$date2=new DateTime($result2[0]);
$diffdate=date_diff($date1,$date2);
$difftime = strtotime($result1[1]) - strtotime($result2[1]);
$dates=$diffdate->format("%R%a days");
echo $dates;
echo $difftime;
?>

Ответ 6

<?php
$value='20140203113405';
$val='20150203113410';

$val1=str_split($val,2);
$dateval1=$val1[0].$val1[1]."-".$val1[2]."-".$val1[3];
$timeval1=$val1[4].":".$val1[5].":".$val1[6];

$val2=str_split($value,2);
$dateval2=$val2[0].$val2[1]."-".$val2[2]."-".$val2[3];
$timeval2=$val2[4].":".$val2[5].":".$val2[6];

$date1=new DateTime($dateval1);
$date2=new DateTime($dateval2);
$diffdate=date_diff($date1,$date2);
$dates=$diffdate->format("%a days");
$difftime = strtotime($timeval1) - strtotime($timeval2);
echo $dates;
echo $difftime."seconds";
?>

Ответ 7

Я собрал много тем, чтобы сделать универсальную функцию со многими выходами (годами, месяцами, днями, часами, минутами, секундами) со строкой или синтаксическим анализом для int и direction + - если вам нужно знать, с какой стороны направлено различие.

Пример использования:



    $date1='2016-05-27 02:00:00';
    $format='Y-m-d H:i:s';

    echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format); 
    #1 years 3 months 2 days 22 hours 1 minutes 59 seconds (string)

    echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format,false, '%a days %h hours');
    #459 days 22 hours (string)

    echo timeDifference('2016-05-27 00:00:00', $format, '2017-08-30 00:01:59', $format,true, '%d days -> %H:%I:%S', true);
    #-3 days -> 00:01:59 (string)

    echo timeDifference($date1, $format, '2016-05-27 00:05:51', $format, false, 'seconds');
    #9 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, false, 'hours');
    #5 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours');
    #-5 (string)

    echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours',true);
    #-5 (int)

функция



    function timeDifference($date1_pm_checked, $date1_format,$date2, $date2_format, $plus_minus=false, $return='all', $parseInt=false)
    {
        $strtotime1=strtotime($date1_pm_checked);
        $strtotime2=strtotime($date2);
        $date1 = new DateTime(date($date1_format, $strtotime1));
        $date2 = new DateTime(date($date2_format, $strtotime2));
        $interval=$date1->diff($date2);

        $plus_minus=(empty($plus_minus)) ? '' : ( ($strtotime1 > $strtotime2) ? '+' : '-'); # +/-/no_sign before value 

        switch($return)
        {
            case 'y';
            case 'year';
            case 'years';
                $elapsed = $interval->format($plus_minus.'%y');
                break;

            case 'm';
            case 'month';
            case 'months';
                $elapsed = $interval->format($plus_minus.'%m');
                break;

            case 'a';
            case 'day';
            case 'days';
                $elapsed = $interval->format($plus_minus.'%a');
                break;

            case 'd';
                $elapsed = $interval->format($plus_minus.'%d');
                break;

            case 'h';       
            case 'hour';        
            case 'hours';       
                $elapsed = $interval->format($plus_minus.'%h');
                break;

            case 'i';
            case 'minute';
            case 'minutes';
                $elapsed = $interval->format($plus_minus.'%i');
                break;

            case 's';
            case 'second';
            case 'seconds';
                $elapsed = $interval->format($plus_minus.'%s');
                break;

            case 'all':
                $parseInt=false;
                $elapsed = $plus_minus.$interval->format('%y years %m months %d days %h hours %i minutes %s seconds');
                break;

            default:
                $parseInt=false;
                $elapsed = $plus_minus.$interval->format($return);
        }

        if($parseInt)
            return (int) $elapsed;
        else
            return $elapsed;

    }

Ответ 8

Вот мой полный пост с темой: PHP найти разницу между двумя датами

ПРИМЕР ИСПОЛЬЗОВАНИЯ


    echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2017-08-30 00:01:59', 'Y-m-d H:i:s', false, '%a days %h hours');
    #459 days 22 hours (string)

    echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2016-05-27 07:00:00', 'Y-m-d H:i:s', true, 'hours',true);
    #-5 (int)