Подтвердить что ты не робот

Вычислить общее количество секунд в PHP DateInterval

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

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

Но я действительно недоволен использованием этого полуподобного решения.

4b9b3361

Ответ 1

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

$now = new DateTime('now');
$diff = $date->getTimestamp() - $now->getTimestamp()

Ответ 2

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

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

    return $endTime->getTimestamp() - $reference->getTimestamp();
}

Ответ 3

Вы можете сделать это следующим образом:

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

$differenceInSeconds = $currentTime - $timeInPast;

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

Ответ 4

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

Ответ 5

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

Изменить - исправлено число, основанное на комментариях.