web-dev-qa-db-ja.com

PHP DateIntervalで合計秒数を計算する

2つの日付間の合計秒数を計算する最良の方法は何ですか?これまでのところ、私は次のラインに沿って何かを試しました:

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

ただし、DateIntervalオブジェクトのdaysプロパティは、現在の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);

しかし、私はこの中途半端なソリューションを使うことに本当に満足していません。

91
efritz

代わりに time stamps を比較できませんか?

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

この関数を使用すると、DateIntervalオブジェクトから合計期間を秒単位で取得できます。

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

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

次のようにできます:

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

$differenceInSeconds = $currentTime - $timeInPast;

time()は、エポック時間(1970-01-01T00:00:00)から現在の時間を秒単位で返します。strtotimeは同じことを行いますが、指定した特定の日付/時刻に基づきます。

5
xil3
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;
}
3
hoofuz