PHP 日時の差分を求める (DateTime)

目次

秒・分・時間・日の差分を求める(getTimestamp)

public DateTime::getTimestamp(): int

DateTime::getTimestamp() を使うと、秒単位のUnixタイムスタンプを取得でき、2つの日付の差を秒で求めることができます。

<?php
$date1 = new DateTime('2020-01-01 10:00:00');
$date2 = new DateTime('2020-01-03 13:30:10');

// タイムスタンプを取得
$ts1 = $date1->getTimestamp();
$ts2 = $date2->getTimestamp();

// 差を計算(秒単位)
$diff_seconds = $ts2 - $ts1;
echo $diff_seconds; // 185410秒
echo nl2br("\n");

// 分に換算
echo floor($diff_seconds / 60); // 3090分
echo nl2br("\n");

// 時間に換算
echo floor($diff_seconds / 3600); // 51時間
echo nl2br("\n");

// 日に換算
echo floor($diff_seconds / 86400); // 2日

getTimestamp() は 「1970-01-01 00:00:00 UTC」からの経過秒数 を返します。

そのため、2つのタイムスタンプの差を取ると「秒差」 が出ます。

あとは 60 で割れば「分」、3600 で割れば「時間」、86400 で割れば「日」に換算できます。

 

日の差分を求める(diff)

public DateTime::diff ( DateTimeInterface $targetObject [, bool $absolute = FALSE ] ) : DateInterval

diffメソッドで日の差分を求めるサンプルです。

<?php
$date1 = new DateTime('2020-07-10');
$date2 = new DateTime('2020-08-05');

$date3 = $date1->diff($date2);
print $date3->format('%R%a'); // +26
print $date3->format('%a'); // 26

$date4 = $date2->diff($date1);
print $date4->format('%R%a'); // -26
print $date4->format('%a'); // 26

2,3行目は、DateTimeクラスのオブジェクトを生成しています。

5行目は、diffメソッドで$date1と$date2の差を求めています。戻り値はDateIntervalオブジェクトです。

6,7行目の、%a は「差の日数の絶対値」、%R は「符号 (+ または -)」です。
この場合 $date2 > $date1 なので 26となり、
6行目は、符号ありの+26、7行目は、符号なしの26となります。

9行目は、$date2 から $date1 を引いているので、差はマイナス方向となります。

以下は、PHPマニュアルのDateIntervalクラスのformatメソッドのリンクです。
https://www.php.net/manual/ja/dateinterval.format.php

 

時間・分・秒の差分を求める(diff)

diffメソッドで時間・分・秒の差分を求めるサンプルです。

<?php
$date1 = new DateTime('2020-01-01 10:00:00');
$date2 = new DateTime('2020-01-03 13:30:10');

$date3 = $date1->diff($date2);

echo $date3->days * 24 + $date3->h; // 51 (時間)

echo $date3->days * 24 * 60 + $date3->h * 60 + $date3->i; // 3090(分)

echo $date3->days * 24 * 60 * 60 + $date3->h * 60 * 60
  + $date3->i * 60 + $date3->s; //185410(秒)

2,3行目は、DateTimeクラスのオブジェクトを生成しています。
5行目は、diffメソッドで日時の差分を計算しています。戻り値はDateIntervalオブジェクトです。
この場合の差は、2日3時間30分10秒です。

7行目は、差を時間で出しています。
$date3->days = 2(日数)
$date3->h = 3(時間)
→ 2*24 + 3 = 51 時間

9行目は、差を分で出しています。
日 → 分換算: 2*24*60 = 2880
時 → 分換算: 3*60 = 180
分: 30
合計 2880 + 180 + 30 = 3090 分

11,12行目は、差を秒で出しています。
日 → 秒: 2*24*60*60 = 172800
時 → 秒: 3*3600 = 10800
分 → 秒: 30*60 = 1800
秒: 10

合計 172800 + 10800 + 1800 + 10 = 185410 秒

 

関連の記事

PHP 現在日時の取得と表示形式 (DateTime)
PHP 日時の加算と減算を行う

△上に戻る