バグ調査でハマった話
今週の水曜木曜は仕事が死ぬほど忙しくて全然個人開発に手をつけられませんでしたが、 その忙しかった理由のバグ調査結果をまとめます。Flutterではなく、PHPですが。 誰かor未来の自分の助けになれば...
結論から言うとphp(v7.4.0くらいだったかな?)の
Carbon::createFromFormat
が悪さをしていたのがわかったんですが、これを詳しく説明していきます。
$date1 = Carbon::createFromFormat('Y-m-d', '2022-04-01'); echo $date1->format('Y-m-d H:i:sO); // 2022-04-01 00:00:00+0000 と思うじゃん? $date2 = new Carbon::('2022-04-01'); echo $date2->format('Y-m-d H:i:sO); // 2022-04-01 00:00:00+0000 $date3 = Carbon::parse('2022-04-01'); echo $date3->format('Y-m-d H:i:sO); // 2022-04-01 00:00:00+0000
この3つのechoのうち、$date1
だけ、なんと結果が違っています。
$date2
と$date3
は両方とも
2022-04-01 00:00:00+0000
になりますが、(デフォルトがUTCの場合)
$date1
は
2022年4月1日には違いないんですが、時刻は実行したマシンorサーバの実行時刻が補完されます。
深夜のバッチなど日付の変わりやすい時間&タイムゾーンだと、思いがけず日付が変わるなどするので、
指定した日付の0時0分0秒が変数に入っていると期待して実装を進めると簡単に致命傷を喰らいます。
気を付けましょう。
これは仕様なのかな?公式ざっと眺めてもよくわからず。仕様として使うのはそれはそれでしれっと変更された時に困る