2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Carbonで日付計算をするときの注意点

Posted at

以前、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()など、日付を計算するものはほとんどこの現象が起きるようです。

日付の操作というのは色々とやっかいなことが多いですね…

2
0
1

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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?