Top > Programming Language > PHP [全て開く]
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]
2010年5月18日

PHPでXML-RPCを利用する方法

May 18,2010 1:55 AM
Tag:[, , ]
Permalink

PHPでXML-RPCを利用する方法を紹介します。ここではMovable TypeのXML-RPCを起動するサンプルを示しますが、他のXML-RPCにも応用できると思います。

このエントリーで紹介する方法ではPHP5が必要です。

1.PEAR::XML_RPC2のインストール

PEAR::XML_RPC2のサイトで「Download」をクリック。PEARとはPHPのクラスライブラリ集で、「PHP Extension and Application Repository」の略です。PEAR::XML_RPC2は、XML-RPCプロトコルをPHP5で実装したものです。

PEAR::XML_RPC2のサイト

バージョンのリンクをクリック。これでアーカイブをダウンロードできます。

PEAR::XML_RPC2のダウンロード

ダウンロードしたアーカイブを展開し、中にあるXMLフォルダを任意のフォルダに配置します。ここではアプリケーションディレクトリに配置します。

なお、XAMPPにはC:\xampp\php\PEAR\XMLがあるので、そこにXMLフォルダを配置しても良いでしょう。最新のXAMPPにはもしかしたらバンドルされているかもしれません。

2.cURL拡張モジュールを有効にする

PEAR::XML_RPC2ではcURL拡張モジュール(php_curl.dll)が必要です。XAMPPの場合、php_curl.dllはC:\xampp\php\extにバンドルされているので、php.iniを修正して拡張モジュールを有効にするだけです。php.iniのパスはC:\xampp\apache\binになります。

修正方法は簡単で、

;extension=php_curl.dll

の先頭の「;」を削除して、

extension=php_curl.dll

とするだけです。修正後、XAMPPを再起動してください。再起動しないと設定が反映されません。

3.サンプルコード

XML-RPCのサンプルコードを以下に示します。サンプルはmetaWeblog.getPostを起動するものなので、他のAPIを起動する場合は、パラメータとAPI名を適宜変更してください。

<html>
<head>
<title>XML-RPC Client</title>
</head>
<body>
<h1>XML-RPC Client</h1>
<?php
require_once("./XML/RPC2/Client.php");
 
// metaWeblog.getPostのサンプル
$prefix = 'metaWeblog.'; // プレフィックス
$encoding = 'utf-8'; // 文字エンコーディング
$uri = 'http://localhost/mt/mt-xmlrpc.cgi'; // mt-xmlrpc.cgiのURI
 
$options = array('prefix' => $prefix, 'encoding' => $encoding);
$client = XML_RPC2_Client::create($uri, $options); // XML-RPXクライアントの生成
 
$entry_id = 1; // ブログ記事ID
$user = 'foo'; // ウェブサービスのユーザー名
$pass = 'hogehoge'; // ウェブサービスのパスワード
 
try {
    $result = $client->getPost($entry_id, $user, $pass); // API起動
} catch (XML_RPC2_FaultException $e) {
    var_dump($e);
} catch (Exception $e) {
    var_dump($e);
}
?>
 
<h2><a href="<?php echo $result["permaLink"]; ?>"><?php echo $result["title"]; ?></a></h2>
<div><?php echo $result["description"]; ?></div>
 
</body>
</html>

返却結果をすべて出力したい場合は、

<h2><a href="<?php echo $result["permaLink"]; ?>"><?php echo $result["title"]; ?></a></h2>
<div><?php echo $result["description"]; ?></div>

の代わりに、

<?php var_dump($result); ?>

を記述すると良いでしょう。

4.参考サイト

Comments [0] | Trackbacks [0]
Now loading...
Introduction
List of "PHP"
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

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

loading ...
Categories
Monthly Archives
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 5.04