web-dev-qa-db-ja.com

phpでDateIntervalオブジェクトを秒に変換します

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);

上記を変換するにはどうすればよいですか$intervalphpで数秒

19
sanchitkhanna26

このための関数formatがあります。ただし、秒数は返されません。秒数を取得するには、この手法を使用します

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp());

本当に使用したい場合は$intervalあなたはそれを計算する必要があります。

$seconds = $interval->days*86400 + $interval->h*3600 
           + $interval->i*60 + $interval->s;

ここに

  • 86400は1日の秒数です
  • 3600は1時間の秒数です
  • 60は1分間の秒数です
24
Shiplu Mokaddim

間隔の秒数を取得する別の方法は、それをゼロの日付に追加し、その日付のタイムスタンプを取得することです。

$seconds = date_create('@0')->add($interval)->getTimestamp();

このメソッドは、DateIntervalコンストラクターを介して作成された間隔をほぼ正しく処理しますが、 shipluの回答 は、そのような間隔の年、月、日を無視します。ただし、shipluの答えは、2つの日付を引くことによって作成された間隔の方が正確です。時間、分、秒のみで構成される間隔の場合、どちらの方法でも正しい答えが得られます。

36
Brilliand

私は shipluの答え: に追加するだけです

function dateIntervalToSeconds($interval)
{
    $seconds = $interval->days*86400 + $interval->h*3600 
       + $interval->i*60 + $interval->s;
    return $interval->invert == 1 ? $seconds*(-1) : $seconds;
}

負の間隔を処理します。

ブリリアンの答え -とは反対に、上記のコードは年、月、日付を正しく考慮していることに注意してください。 $ interval-> daysは絶対値であるため($ interval-> dは月を基準にしています)。

EDIT:@で指摘されているように、この関数はまだ正しくありませんブリリアン。反例は

new DateInterval('P4M3DT2H'); 

それは月をうまく処理しません。

2
Alvaro Neira