PHPで日付や時間を扱う際に頻繁に利用する「strtotime関数」
真面目にドキュメントを読めば良いのですが、現場で対応していると「目的の機能を実装するためにコピペ」というパターンも多いかと思います。
ちょっと真面目に調べてみたら、意外と便利な関数でした!
strtotime関数ですが、説明としては「 英文形式の日付(時間)を Unix タイムスタンプに変換する 」ということになります。
雑に言ってしまえば「様々な表記の日付(時間)を扱える」ということです。
「様々な表記」というと「2019/01/01」や「2019年1月1日」、「2019-01-01」とかを想像しがちですね。
(2019年1月1日は英文形式じゃないだろうというのは一旦置いといて)
時間形式となるとあまり思いつきませんが…「AM09:00」や「23:55」など、12時間表記と24時間表記などがあるでしょうか。
そして今回扱う「strtotime関数」ですが、以下のような表記も利用可能です!
- strtotime(“now”)
- strtotime(“1 January 2019”)
- strtotime(“next Thursday”)
- strtotime(“last Monday”)
「now」や「1 January 2019」は想定の範囲内ですが…
「next Thursday」「last Monday」もOKだって!?
ドキュメント内にこの記述を見つけたとき、目から鱗が落ちました。
必死に今日が●曜日で、次の○曜日を表示したいから■日足して…
なんてことをしないでも大丈夫です!素敵!!
必死に今日が●曜日で、前の○曜日を表示したいから…
あれ、でも○曜日は■曜日のパターンもあるし…どうすれば良いんだ!?
なんてことをしないでも大丈夫です!素敵!!
実際に利用する場合には以下のようになるかと思います。
$week = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
date('Y/m/d', strtotime('last ' . $week[$hoge] , $now->getTimestamp()))
ここまで触れていませんでしたが、strtotime関数は引数が1つまたは2つ指定できます。
第一引数:日時の文字列
これは先ほどご紹介したとおり、様々なフォーマットを扱えます。
第二引数:タイムスタンプ(int)
基準となるタイムスタンプを指定します。
「next Monday」と言われても、どこを基準にした「次の月曜日」なのかわかりません。
第二引数にタイムスタンプを指定することで、基準が明確になるわけですね。
例えば…
strtotime('last Monday' , $now->getTimestamp())
このように指定すると、「今日を基準にした、最後の月曜日」となるわけです。
基準になる日を変更すれば「○月✖日の直前の月曜日」も簡単に表示できます。
date関数は、UNIXタイムスタンプしか扱えませんので、通常strtotime関数とセットで利用しているかと思います。
その部分の表記を変更することで、簡単に直前の○曜日が表示されるようになりますね。
ポイントとしては「last」の後の半角スペース…でしょうか。
意外と見落としてしまいがちなので注意しておきましょう。
…ちゃんとドキュメントを読むことが、最適解への近道ですよ!
という自戒の内容でした。