えらい目にあったので共有。
現象
タイムゾーンをAsia/Tokyoに設定しているのに、UTCで内部処理されている(今回の場合はCarbon)
環境
- Larvel ^8.75 時刻設定 日本対応済
- phpunit 9.5.19
問題のあるテストコード
下記のようなテストコードでテストを行っていた
<?php use Carbon\Carbon // 中略 public function hogeData() { return [ "テストA" => [new Carbon("2000-01-01 10:00")] ]; } /** hogeなテスト @dataProvider hogeData @param Carbon $_date 日付 */ public function test_hoge($_dateA) { //中略 $_dateB = new Carbon("2000-01-01 10:00"); // ここで$_dateAと$_dateBは同じ日時か // 判定を行うとfalseとなる! } //中略
上記コードで$dateAと$dateBが同一日時か判定すると、falseとなった。
検証
ちょっと意味がよくわからないので、上記コードを下記コードのように変更し、タイムゾーンの確認を行った。
<?php // 中略 public function hogeData() { echo ("A : " . date_default_timezone_get()); return [ "テストA" => [new Carbon("2000-01-01 10:00")] ]; } // コメント部略 public function test_hoge($_dateA) { //中略 echo ("B : " . date_default_timezone_get()); } //中略
上記のようなコードを実行した結果。
実行部位 | タイムゾーン |
---|---|
echo A | UTC |
echo B | Asia/Tokyo |
となった。全く意味がわからないが、そういうものらしい。
結論
Carbon変数をdataProvider内に置く場合は、
new Carbon("2000-01-01", "Asia/Tokyo")
としておくほうが安全である。