DateTime::diff一覧

PHPで経過時間(日付の差)を求める方法

Twitterを使用していたりするとツイートした時間から、ツイート表示時点での経過時間がタイムライン上のツイート上に表示されていたりします。

今回の記事では、PHPで経過時間を求める方法について紹介します。

DateTime::diffメソッドを使用する(PHP 5.3.0以上の場合)

PHP 5.3.0以上の場合、比較的簡単に時間の経過時間を求めることが出来ます。
その方法は、DateTime::diffメソッドを使用する方法です。

//過去の日時を指定
$date_before = new DateTime('2017-04-02 23:59:59');

//現在の日時を設定
$date_now = new DateTime();

$interval = $date_before->diff($date_now);

$elapsed = $interval->format('%y years %m months %d days %h hours %i minutes %s seconds');
echo $elapsed;

上記のプログラムを実行すると下記のような結果が出ます。

1 years 1 months 20 days 10 hours 22 minutes 38 seconds

このコードではformatメソッドを使って「書式付き」という特殊な形で経過時間を取得しています。
formatメソッドの引数に「%d」等と与えることで日付の差を得ることができます。

他にもより簡単な方法として下記のような方法があります。

//過去の日時を指定
$date_before = new DateTime('2017-04-02 23:59:59');

//現在の日時を設定
$date_now = new DateTime();

$interval = $date_before->diff($date_now);

echo $interval->y.' years '.$interval->m.' months '.$interval->d.' days '.$interval->h,' hours '.$interval->i .'minutes '.$interval->s.' seconds';

diffメソッドで日付を比較し、その戻り値のy/m/d/h/i/sといったプロパティにアクセスすることで、日付の差分を出すことが出来ます。

DateTime::diffメソッドのバグ


Bug #51184 DateInterval has incorrect days property on windows

ほとんどの場合、大丈夫ですが、このDateTime::diffメソッドにはバグも報告されています。

Datetime::diffで日付を比較しても常に戻り値に6015が戻ってきてしまうバグということです。

もし、このような結果に悩んでいる方は、リンク先を参照してみてください。

PHP5.3.0未満の場合

今では、PHP5.3.0未満で動いている環境はあまりないと思いますが、Datetime::diffを使用したくないなど何らかの理由がある場合は、下記のような方法で、二つの日付の経過時間を求めることが出来ます。しかし、正確にやるためにはより複雑なロジックが必要となります。
下記の例では、1ヶ月を30日と固定しています。

$date1 = "2007-03-24";
$date2 = "2009-06-26";

$diff = abs(strtotime($date2) - strtotime($date1));

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

printf("%d years, %d months, %d days\n", $years, $months, $days);

Unixタイムスタンプの差から経過時間を求める方法ですが、もし、自分で日付の差を求めたい場合がある方などは、参考にしてください。

How to calculate the difference between two dates using PHP?」に正確に求める方法も記載されているので、参考にしてみてください。

PHPの日付時刻関連のライブラリ

PHPには、日付時刻関係の有名なライブラリが、あります。
曜日を算出したり、日付の差などの比較など色々な操作を直感的に行えます。

興味のある方は、下記の記事を参照ください。

PHPで日付関連の処理をするのに便利なCarbonの使用方法について紹介しています。CarbonはGitHubでも多数のスターの付く人気の日付関連のライブラリーです。
PHPの日付・時刻ライブラリChronosの機能について紹介しています。Carbonとの違いについても説明しています。

[参考]
How to calculate the difference between two dates using PHP?