以前、LaravelのFakerでダミーデータを作成していた時に、はまったものを記事にしたいと思います。
内容は日付のあれこれに欠かせないCarbonについてです。
事象
$startDate = new Carbon('2023-12-01 00:00:00');
$endDate = $startDate->addWeeks(2);
例えば、2023-12-01から2週間後の日付を取りたいという時は、上記のように書けると思います。
じゃあいざfakerで使用しようと思って、下記のように使用してみました。
$hoge->hoge = $faker->dateTimeBetween($startDate, $endDate)->format('Y-m-d h-m-s');
しかし、何度やっても$startDateの2週間後の値しか生成されない…
そこで$startDate
の値をみてると、$startDate
までも2週間後の日付になっているじゃないですか…
どうやらCarbonの仕様のようですね…
解決策
そしたらさすがのCarbonさん、きちんとメソッドを用意してくれてました。
$startDate = new Carbon('2023-12-01 00:00:00');
$endDate = $startDate->copy()->addWeeks(2);
上記のようにcopy()メソッドを使用すれば、元の$startDate
はそのまま侵食されずに済むようです。
$hoge->hoge = $faker->dateTimeBetween($startDate, $endDate)->format('Y-m-d h-m-s');
これで2023-12-01から2週間の間での日付をランダムに生成することができました。
おわりに
どうやらこちらはaddWeeks()
だけでなく、addYears()
とかaddMonth()
など、日付を計算するものはほとんどこの現象が起きるようです。
日付の操作というのは色々とやっかいなことが多いですね…