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