TopProgramming LanguagePHP > PHPのmktime()で取得したタイムスタンプが8ヶ月前になる事象について
2010年9月 2日

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

Posted at September 2,2010 1:33 AM
Category:[PHP]
Tag:[, , ]

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項を修正しました。

Posted by yujiro   このページの先頭に戻る
関連記事
    この記事を読んだ人はこんな記事も読んでいます
    人気エントリー
    Hatena Hot Entries
    Hatena Entries
    トラックバックURL


    コメント
    この事象は、月に「08」と「09」を設定した場合に発生するようです。

    PHPでは、0で始まる文字列は八進数として処理されます。
    # 参考:http://css-php.com/php/2-2.htm

    八進数で扱えるのは 0 ~ 7 までなので、08(八進数表記) → 0(十進数表記) に変換されるためです。
    var_dump(08) 等として確認してみてください。

    なので
    mktime(01,23,45,08,01,2010)
    は、
    mktime(1,23,45,0,1,2010)
    として評価されてしまい、2010年0月1日→2009年12月1日が返ってくるのです。

    [1] Posted by をかもと : September 2, 2010 10:17 AM

    >をかもとさん
    こんにちは。
    情報ありがとうございました。
    勉強になりました。
    頂いた内容は本文に追記しておきたいと思います。

    [2] Posted by yujiro logo : September 2, 2010 12:47 PM
    コメントする
    greeting

    *必須

    *必須(非表示)


    ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

    太字 イタリック アンダーライン ハイパーリンク 引用
    [サインインしない場合はここにCAPTCHAを表示します]

    コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

    コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)

    Now loading...
    Introduction
    Entries of this Category
    Recent Entries
    Recent Comments
    Recent Trackbacks
    QRcode

    現在停止中です
    携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

    URI for cellular phones
    ギターに入った猫
    Styles
    Font Size
    Default
    For defective color vision
    Gray Scale
    RGB Color
    Search this site
    loading ...
    Categories
    Monthly Archives
    BlogPeople
    Syndicate this site
    FeedBurner(RSS1.0/RSS2.0/Atom)
    Counter
    これまでのアクセス
    クリエイティブ・コモンズ・ライセンス
    Powered by
    Movable Type 5.12