読者です 読者をやめる 読者になる 読者になる

mPDF (5.7.4) はタイムゾーン設定を勝手に書き換えるので注意

PHP

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 プロジェクトでもこの問題がバグとして報告されている。