TopProgramming LanguagePHP > 2010年9月
2010年9月 2日

PHPのmktime()で取得したタイムスタンプが8ヶ月前になる事象について

September 2,2010 1:33 AM
Tag:[, , ]
Permalink

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]
Now loading...
Recent Entries
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2022年
2021年
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3