July 14, 2021 • ☕️ 3 min read
PHP の 日付ライブラリにおいて、デファクトスタンダードの地位を築きつつあるんじゃないかと思われる Carbon。
Laravel にデフォルトで入ってるし、色々と便利なのでよく使っているのですが、気になった事があったので調べてみた。
日付の減算をする時、subDays というメソッドがあるんだけど、ネットを徘徊していると、subDay に引数を渡す使い方もよく見かける。
具体的には以下のような感じ。
$date1 = new Carbon('2021-07-15 11:23:45');
$date2 = new Carbon('2021-07-15 11:23:45');
echo $date1->subDay(1); //=> 2021-07-14 11:23:45
echo $date2->subDays(1); //=> 2021-07-14 11:23:45
見ての通り、結果は同じ。
何なんだコレは。どっち使えばいいんだ。
つーか統一しないとカオス化するじゃねーか。
という事で公式ドキュメント。
https://carbon.nesbot.com/docs/
no arguments
Sub one day to the instance (using date interval).
Sub days (the $value count passed in) to the instance (using date interval).
Carbon::subDays を使う方が良さそう。
というか、「Carbon::subDay」の実際の挙動が、ドキュメントと違っているのでは?
という事で、Carbon のソースコードを見てみよう。
https://github.com/briannesbitt/Carbon
こんなコードがありました。
https://github.com/briannesbitt/Carbon/blob/master/tests/Carbon/SubTest.php#L261
public function testSubDayPassingArg()
{
// subDay should ideally be used without argument
/** @var mixed $date */
$date = Carbon::createFromDate(1975, 5, 10);
$this->assertSame(8, $date->subDay(2)->day);
}
subDay should ideally be used without argument
(subDayは理想的には引数なしで使用する必要があります)
subDay に引数を渡すと subDays と同様の動きをする事は把握しているけど、それは理想的な使い方ではないみたい。
あと、メソッドの説明文を読んでも、subDay に引数を渡す内容は無いみたい。
* @method $this subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval).
* @method $this subDay() Sub one day to the instance (using date interval).
値を指定した日付の減算には「subDays」を使おう!