元海外在住エンジニアの人生

必死にのらりくらりしてます

バグ調査でハマった話

今週の水曜木曜は仕事が死ぬほど忙しくて全然個人開発に手をつけられませんでしたが、 その忙しかった理由のバグ調査結果をまとめます。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秒が変数に入っていると期待して実装を進めると簡単に致命傷を喰らいます。 気を付けましょう。


これは仕様なのかな?公式ざっと眺めてもよくわからず。仕様として使うのはそれはそれでしれっと変更された時に困る