kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Carbon: v2 と v3 で diffInYears() の結果が異なる

PHP の日付ライブラリ Carbon で v2 から v3 へのバージョンアップを検証してるときに diffInYears メソッドの結果に差があることに気付いた.ドキュメントの Migrate to Carbon 3 セクションを読むと Yes, the most impactful change is in diffIn* methods. と書いてある.よって diffInYears 以外にも影響がある.

carbon.nesbot.com

diffInYears()

👾 index.php

以下のサンプルコードがあるとする.2050年から2020年に対して年数の比較をする🕐️

use Carbon\Carbon;

$date1 = Carbon::parse('2020-01-01');
$date2 = Carbon::parse('2050-01-01');
echo $date2->diffInYears($date1);

nesbot/carbon v2.73.0(v2 最新)

Carbon v2 で実行すると 30 になる.

$ php index.php 
30

nesbot/carbon v3.10.3(v3 最新)

Carbon v3 で実行すると -30 になる.ドキュメントにも書いてある通り,Carbon v2 と同じ挙動にするためには abs() を使って絶対値を取得する必要がある.

$ php index.php 
-30

age プロパティ

👾 index.php

内部的に diffInYears メソッドを使っている age プロパティも同じ挙動になる.2050年から年齢を取得する🕐️

use Carbon\Carbon;

$Birthday = '2050-01-01';
echo Carbon::parse($Birthday)->age;

nesbot/carbon v2.73.0(v2 最新)

Carbon v2 で実行すると 24 になる.

$ php index.php 
24

nesbot/carbon v3.10.3(v3 最新)

Carbon v3 で実行すると -24 になる.

$ php index.php 
-24

👾 index.php(修正後)

よって,以下のように実装すると Carbon v2 と同じ挙動になる👌

use Carbon\Carbon;

$Birthday = '2050-01-01';
echo (int) abs(Carbon::parse($Birthday)->age);