Рассчитать общее количество секунд в PHP DateInterval - PullRequest
86 голосов
/ 05 июля 2010

Как лучше всего рассчитать общее количество секунд между двумя датами?До сих пор я пробовал что-то вроде:

$delta   = $date->diff(new DateTime('now'));
$seconds = $delta->days * 60 * 60 * 24;

Однако свойство days объекта DateInterval, похоже, не работает в текущей сборке PHP5.3 (по крайней мере, в Windows,всегда возвращает одно и то же значение 6015).Я также попытался сделать это таким образом, чтобы не сохранить количество дней в каждом месяце (раундов до 30), високосных лет и т. Д .:

$seconds = ($delta->s)
         + ($delta->i * 60)
         + ($delta->h * 60 * 60)
         + ($delta->d * 60 * 60 * 24)
         + ($delta->m * 60 * 60 * 24 * 30)
         + ($delta->y * 60 * 60 * 24 * 365);

Но я действительно недоволен этимнедоделанный раствор.

Ответы [ 5 ]

181 голосов
/ 05 июля 2010

Не могли бы вы вместо этого сравнить отметки времени ?

$now = new DateTime('now');
$diff = $date->getTimestamp() - $now->getTimestamp()
30 голосов
/ 06 августа 2014

Эта функция позволяет получить общую продолжительность в секундах от объекта DateInterval

/**
 * @param DateInterval $dateInterval
 * @return int seconds
 */
function dateIntervalToSeconds($dateInterval)
{
    $reference = new DateTimeImmutable;
    $endTime = $reference->add($dateInterval);

    return $endTime->getTimestamp() - $reference->getTimestamp();
}
5 голосов
/ 05 июля 2010

Вы можете сделать это так:

$currentTime = time();
$timeInPast = strtotime("2009-01-01 00:00:00");

$differenceInSeconds = $currentTime - $timeInPast;

time () возвращает текущее время в секундах с момента времени эпохи (1970-01-01T00: 00: 00), и strtotime делает то же самое, но на основе заданной вами даты / времени.

3 голосов
/ 23 января 2011
static function getIntervalUnits($interval, $unit)
{
    // Day
    $total = $interval->format('%a');
    if ($unit == TimeZoneCalc::Days)
        return $total;
    //hour
    $total = ($total * 24) + ($interval->h );
    if ($unit == TimeZoneCalc::Hours)
        return $total;
    //min
    $total = ($total * 60) + ($interval->i );
    if ($unit == TimeZoneCalc::Minutes)
        return $total;  
    //sec
    $total = ($total * 60) + ($interval->s );
    if ($unit == TimeZoneCalc::Seconds)
        return $total;  

    return false;
}
0 голосов
/ 05 июля 2010

Вы можете просто ввести жесткие числа (вместо 60 * 60 - ввести 3600), чтобы не нужно было каждый раз вычислять их.

Редактировать - исправлять число на основе вашего комментария.

...