(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(...);