2010年9月 2日
PHPのmktime()で取得したタイムスタンプが8ヶ月前になる事象について
PHPのmktime()関数を使ったカスタマイズで躓いたので情報展開しておきます。動作確認したPHPのバージョンは5.2.13です。
1.問題
次のコードは、指定した日付のエポック秒(1970年1月1日0時0分0秒から、指定した時刻までの通算秒)を取得し、それを年月日時分秒に変換して表示する簡単なサンプルです。
<?php
$date = mktime(01,23,45,08,01,2010);
echo date('Y.m.d A H:i.s',$date);
?>
mktimeの引数は左から順番に、「時・分・秒・月・日・年」となります。このコードを実行すると、
2010.08.01 AM 01:23.45
という結果になるはずですが、実行すると、
2009.12.01 AM 01:23.45
となり、指定したタイムスタンプよりも8ヶ月前になってしまいます。
2.原因と対処
PHPでは、整数に「0」を付与すると8進数として扱われ、「08」は「0」として扱われることが原因です。つまり、指定した値「08月」をmktimeで評価すると「0月」となり、さらに「0月」は前年の12月として評価されるため、1項に記した動作となります。
月の「08」を1桁の「8」に変更することで、この問題は解消します。
<?php
$date = mktime(01,23,45,8,01,2010);
echo date('Y.m.d A H:i.s',$date);
?>
この事象は、月に「08」と「09」を設定した場合に発生します。
3.その他
この事象をみつけた経緯は、Movable Typeのテンプレートタグと組み合わせて、
$entry_date = mktime(<mt:EntryDate format="%H,%M,%S,%m,%d,%Y" />);
ということを行ったためです。この場合、「%m」を「%B」にすることで解消します。
$entry_date = mktime(<mt:EntryDate format="%H,%M,%S,%B,%d,%Y" />);
2010.09.02
をかもとさんからのコメントを受けて、2項を修正しました。
Comments [2]
| Trackbacks [0]