PHPerにはおなじみ(?)の日付ライブラリ、Carbon。
最近これを使う機会ができて、ドキュメント(英語)を見ながら「うおーっ」ってなっております。
何かと多機能ではありますが、使いどころの多そうなcreateFromDate
関数の引数補完がめっちゃ賢いなと思ったのでシェアします。
createFromDate()の補完機能
実は引数なしでも使える
通常こんな感じですが
Carbon::createFromDate(2018, 9, 13); // "2018-09-13 18:58:43"
実は引数なしだと、実行した日時の情報で補完してくれます。
Carbon::createFromDate(); // "2018-09-13 18:58:43"
一部だけ引数がある場合
Carbon::createFromDate(null, 12, null); // "2018-12-13 18:58:43"
引数を当てた部分だけ切り替わります。
実在しない日付の場合
Carbon::createFromDate(null, null, 31); // "2018-10-01 18:58:43"
そのまま出力されれば2018-09-31となりそうなところ。
9月31日は存在しないので、次月にうまく切り上げてくれます。かしこい。
使いどころ
引き継いだ案件で、こんな実装がされていましたが
// ①: nullの変数にデフォルト値を突っ込む処理
if(is_null($year)) { $year = date("Y"); }
if(is_null($month)) { $month = date("n"); }
if(is_null($day)) { $day = date("j"); }
// ②: ①を引数に取る
Carbon::createFromDate($year, $month, $day);
①はすでに組み込まれているということですね。
すっきり実装できてよろしい。
now()やtoday()との違いは?
今後の参考にと思って、一応確かめました。
$date = Carbon::createFromDate(); // "2018-10-01 18:58:43"
$now = Carbon::now(); // "2018-10-01 18:58:43"
$today = Carbon::today(); // "2018-10-01 00:00:00"
引数なしのcreateFromDate()
は、now()
と同等と見て良さそうです。
today()
は時刻がリセットさせていますね。
ちなみに、
$date === $now //false
// stringにキャストしてみる
(string)$date === (string)$now //true
全く一緒ではないみたい。なんだろ?
さいごに
checkdate
みたいなチェック系の関数がもっと充実してたら良いのに。