mPDF (5.7.4) はタイムゾーン設定を勝手に書き換えるので注意
HTML で書かれたコードから PDF を出力できる mPDF という PHP ライブラリがある。HTML と CSS を理解していれば思い通りに、とまではいかないまでも、それなりにレイアウトすることができる。
あるときこの mPDF を使っていたところ、出力される日時がずれてしまう問題が発生した。 date_default_timezone_set() を使ってタイムゾーンを設定しているのにおかしいと思い、コードを追いかけると mPDF を読み込む段階でタイムゾーン設定が書き換わっていることが分かった。
<?php date_default_timezone_set('Asia/Tokyo'); echo date_default_timezone_get(); // => Asia/Tokyo require_once '/path/to/mpdf.php'; echo date_default_timezone_get(); // => Europe/London
原因は mpdf.php の 54 行目に書かれている次の一文。
if (ini_get("date.timezone")=="") { date_default_timezone_set("Europe/London"); }
このコードではスクリプトでタイムゾーンが設定されていても、ini ファイルにタイムゾーンの設定がなければ date_default_timezone_set("Europe/London") が実行されてしまう。もしタイムゾーンの設定がどこにもなければ PHP はデフォルトのタイムゾーンである UTC を使用するので、わざわざタイムゾーンを設定する必要はない。よって mpdf.php の 53〜55 行目をコメントアウトして使用する。
mPDF の GitHub プロジェクトでもこの問題がバグとして報告されている。