プログラミング

[PHP&JavaScript] 2つの日付の差分を求める方法

だんだん暖かくなってきましたね。

こんにちは!

底冷えする日も減ってきて、もうそろそろ春かな〜

さてさて、ある一定の日付の期間だけ何かを表示させたいとか、表示を変えたいとか、そういうことってよくありますよね。

そんな時に PHP や JavaScript を使用して日付の差分を取りたいけど、どうやるんだ?ということがすぐに分からず苦労したので(ヨワヨワ発言)、今回は、

[PHP&JavaScript] 2つの日付の差分を求める方法

と題して、具体的な書き方&仕組みを以下にまとめたいと思います。

前回ブログはこちらから↓

DATETIME 型日付の差分を求める

今回扱う日付は、MySql でいうところの DATETIME フォーマットとしたいと思います。

DATETIME とは日付と時間の両方を含む値で、’YYYY-MM-DD HH:MM:SS’ という形式で表されます。

例えば、’2021-03-01 16:10:30′ とかいう感じですね。

[PHP] 2つの日付の差分を求める方法

では早速、まずは PHP で DATETIME 型日付の差分を求める方法について考えてみます。

ソースコード( PHP )

$day1 = new DateTime('2021-03-10 15:24:40'); // 日付1
$day2 = new DateTime('2021-03-20 18:10:10'); // 日付2
$diff = $day2->diff($day1); // 日付1と日付2の差分を求める
$diffDate = $diff->format('%a');  // 出力結果=>10日(日数の差分)
$diffDateTime = $diff->format('%D日 %H時間 %I分 %S秒');  // 出力結果=>10日 02時間 45分 30秒(日数、HH:MM:SSの差分)

まず DateTime クラスを使って、現在日時と比較したい日時をそれぞれ定義します。

そして diff メソッドを使って2つの DateTime オブジェクトの差分を求めます。

diff メソッドの戻り値 ($diff )は DateInterval オブジェクトですが、DateInterval オブジェクト のままだと使えないので…

( 下記は $diff を dump した結果です)

format メソッドを使って必要なデータを取得します。

format メソッドに使用できる書式文字列は色々あるのですが、ここでは代表的な日数(‘%a’)、時間(‘%H または%h’)、分(‘%I または%h’)、秒(‘%S または%s’)を使って日付の差分を取得してみました。

diff は DateTime オブジェクト同士の差分を求めるメソッド

注意なのは、diff を使って2つの日付の差分を求めたい場合、両者がどちらとも DateTime オブジェクトである必要があります。

試しに date 関数を使って求めた日付に対して diff メソッドを使おうとすると下記のように怒られます。

$day1 = new DateTime('2021-03-10 15:24:40'); // 日付1
$day2 = date('2021-03-20 18:10:10'); // 日付2
$diff = $day2->diff($day1); // 現在日時と公開日時の差分
~以下略~
Fatal error: Uncaught Error: Call to a member function diff() on string in

diff() メソッドを使用するためには比較する両者がオブジェクトである必要があるのに、$date2 は date 関数を使用しているから戻り値が stiring になってて差分を求められないよー

とのことです。

[JavaScript] 2つの日付の差分を求める方法

次は、JavaScript で同じように2つの日付の差分を求めたいと思います。

ソースコード( JavaScript )

const day1 = new Date('2021/03/25 16:50:20'); // 日付1
const day2 = new Date('2021/04/12 07:20:30'); // 日付2
const diff = day2.getTime() - day1.getTime(); // 2つの日付の経過ミリ秒
const diffDay = Math.floor(diff / (1000 * 60 * 60 * 24)); // 出力結果=>17(日数の差分)
const diffHour = Math.floor(diff / (1000 * 60 * 60)); // 出力結果=>422(時間の差分)

 まず2つの日付について、 Date オブジェクトを生成して、getTime() メソッドを使って2つの日付の経過ミリ秒を算出します。

その後ミリ秒を Math.floor() メソッドを使用して、算出したい単位に変換します。

分かってれば超簡単なんですけどね…

初めてやろうとするとなんだかんだうまくいかないのがプログラミングかな。(いや、自分の頭の出来の問題か……)

まとめ

今回は、PHP&JavaScript それぞれの、2つの日付の差分を求める方法について書いてみました。

実務で書くときは時間が限られているので、想定の挙動が実現できたら深追いしないのですが、

こう改めて文章化してみると知らないことがいろいろ出てきて、ふむふむ…となってしまいました。。

あとは、わからないことがあるときは書籍をみるのが一番早いなぁ…と改めて書籍の重要性を体感しました。

ググる力も重要ですが、書籍は著名な方が書いているので、記事内容の信憑性が高いというところは安心できますよね。

ではでは今回はこの辺で。

ここまでお読みいただき、ありがとうございました!