Как сравнить две временные метки в пользовательском формате?


У меня есть две временные метки, которые сформированы следующим образом: substr( date( 'YmdHisu' ), 0, 17 )

20120921105240000
20120921115626000

Теперь, как мне их сравнить?

Я попытался сделать простой подход, такой как:

$diff = abs( 20120921105240000 - 20120921115626000 );

Но это не дает мне необходимого результата, так как время все портит. Все, что я хочу сделать, это выяснить, сколько минут (или секунд) прошло между ними.

Заранее благодарю.

Author: Peon, 2012-09-21

3 answers

$date1 = DateTime::createFromFormat('Ymdhisu', '20120921105240000');
$date2 = DateTime::createFromFormat('Ymdhisu', '20120921115626000');
$interval = $date1->diff($date2);
print_r($interval);

/*DateInterval Object
(
    [y] => 0
    [m] => 0
    [d] => 0
    [h] => 1
    [i] => 3
    [s] => 46
    [invert] => 0
    [days] => 0
)*/

$seconds = $date2->getTimestamp()-$date1->getTimestamp();
echo $seconds;

Пример

Смотрите дополнительную информацию об объекте и методе.

Для PHP

Метод sscanf + mktime:

$date1 = '20120921105240000';
$date2 = '20120921115626000';

function parse_mydate_string($string) {
    if ($a = sscanf($string, '%4s%2s%2s%2s%2s%2s') {
        if (FALSE !== $r = mktime($a[3], $a[4], $a[5], $a[1], $a[2], $a[0])) {
            return $r;
        }
    }
    throw new InvalidArgumentException('Not the expect date string.');
}

$diff    = parse_mydate_string($date1) - parse_mydate_string($date2);    
$absdiff = abs($diff);

Или sscanf + vsprintf + strtotime:

$date1 = '20120921105240000';
$date2 = '20120921115626000';

$date1 = vsprintf('%s-%s-%s %s:%s:%s', sscanf($date1, '%4s%2s%2s%2s%2s%2s'));
$date2 = vsprintf('%s-%s-%s %s:%s:%s', sscanf($date2, '%4s%2s%2s%2s%2s%2s'));

$diff = abs(strtotime($date2) - strtotime($date1));

Или несколько substr строковые операции + strtotime:

$date1 = '20120921105240000';
$date2 = '20120921115626000';

$date1 = substr($date1, 0, 4).'-'.substr($date1, 4, 2).'-'.substr($date1, 6, 2).' '.substr($date1, 8, 2).':'.substr($date1, 10, 2).':'.substr($date1, 12, 2);
$date2 = substr($date2, 0, 4).'-'.substr($date2, 4, 2).'-'.substr($date2, 6, 2).' '.substr($date2, 8, 2).':'.substr($date2, 10, 2).':'.substr($date2, 12, 2);

$diff = abs(strtotime($date2) - strtotime($date1));
 6
Author: Mihai Iorga, 2012-09-21 09:58:29

Вам лучше использовать стандартный формат даты/времени, чтобы избежать выполнения всей работы с нуля.

Взгляните на обсуждение здесь: PHP Как найти время, прошедшее с даты?

 0
Author: Snowcrash, 2017-05-23 12:04:38

Попробуйте с strcmp, конечно, лучший способ - преобразовать его в объект Datetime, прежде чем сравнивать его

 -1
Author: Marcus, 2012-09-21 09:06:59