LoginSignup
3

More than 5 years have passed since last update.

【Carbon】createFromDate関数の引数補完がいい感じ

Last updated at Posted at 2018-09-13

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みたいなチェック系の関数がもっと充実してたら良いのに。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3