(2021/01/18 追記)
バージョン
what
すでに公式に issue が上がってるが、今回調べた事をメモ
issue に書いてある内容のまとめ
下記の場合に diffInMonths が正しい結果を返さない
App.defaultTimezoneが UTC 以外の場合に、タイムゾーンを指定せず、new Chronos()してdiffInMonths()- タイムゾーンに UCT 以外を指定して
new Chronos()してdiffInMonths()
原因
Chronos 2.x 以降、Date のタイムゾーンは常にサーバのタイムゾーン (
App.defaultTimezone) に固定されるDate(Chronos) は内部で、Datetime(PHP) のdiff()を使用している上記により
回避方法
- diffInMonths する前に、UTCで日時を偽装する
$chronosJST = (Chronos()::now)->setTimezone('+09:00');
// diffInMonths する前に、UTCで日時を偽装
$chronosFake = (Chronos::create(
(int)$chronosJST->format('Y'),
(int)$chronosJST->format('m'),
(int)$chronosJST->format('d'),
(int)$chronosJST->format('H'),
(int)$chronosJST->format('i'),
(int)$chronosJST->format('s'),
(int)$chronosJST->format('u'),
'UTC'
));
$chronosFake->diffInMonths(...);