最近、日付関数で使える定数の存在を知りました。
以下の定数は PHP 5.1.1 以降で定義されており、標準的な日付の書式を表します。 日付フォーマット関数(date() など)で使用します。
- DATE_ATOM (string)
- Atom (例: 2005-08-15T15:52:01+00:00)
- DATE_COOKIE (string)
- HTTP クッキー (例: Monday, 15-Aug-05 15:52:01 UTC)
- DATE_ISO8601 (string)
- ISO-8601 (例: 2005-08-15T15:52:01+0000)
- DATE_RFC822 (string)
- RFC 822 (例: Mon, 15 Aug 05 15:52:01 +0000)
- DATE_RFC850 (string)
- RFC 850 (例: Monday, 15-Aug-05 15:52:01 UTC)
- DATE_RFC1036 (string)
- RFC 1036 (例: Mon, 15 Aug 05 15:52:01 +0000)
- DATE_RFC1123 (string)
- RFC 1123 (例: Mon, 15 Aug 2005 15:52:01 +0000)
- DATE_RFC2822 (string)
- RFC 2822 (Mon, 15 Aug 2005 15:52:01 +0000)
- DATE_RFC3339 (string)
- DATE_ATOM と同じ (PHP 5.1.3 以降)
- DATE_RSS (string)
- RSS (Mon, 15 Aug 2005 15:52:01 +0000)
- DATE_W3C (string)
- World Wide Web コンソーシアム (例: 2005-08-15T15:52:01+00:00)
PHP: 日付・時刻関数 - Manual
AtomとかRSSとか、結構流行(?)にそったフォーマットが用意されている事に少し驚きつつ、Last-Modifiedとかに使えるのか悩んでいます。
If-Modified-Since = "If-Modified-Since" ":" HTTP-date
...
Last-Modified = "Last-Modified" ":" HTTP-date
...
HTTP-date = rfc1123-date | rfc850-date | asctime-date
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
rfc850-date = weekday "," SP date2 SP time SP "GMT"
asctime-date = wkday SP date3 SP time SP 4DIGIT
Hypertext Transfer Protocol -- HTTP/1.1 (RFC2616)
少なくとも、HTTP/1.1で定義されているHTTP-dateのうち、rfc1123-dateとrfc850-dateでは末尾のタイムゾーンが"GMT"で決めうちのようです。asctime-dateはタイムゾーンを使わない模様。あまりRFCと実際の実装について詳しくないので、あれですが、少なくともHTTPヘッダにおいては自分でフォーマットを書き続けた方がよろしそう。
以下は、自分の環境で先述の定数を書き出した結果です。
<?php
$date_const_list = array(
'DATE_ATOM',
'DATE_COOKIE',
'DATE_ISO8601',
'DATE_RFC822',
'DATE_RFC850',
'DATE_RFC1036',
'DATE_RFC1123',
'DATE_RFC2822',
'DATE_RFC3339',
'DATE_RSS',
'DATE_W3C',
);
foreach ($date_const_list as $date_const) {
echo sprintf("%16s: %-16s\t%s\n",
$date_const,
constant($date_const),
date(constant($date_const)));
}
/** 結果
* DATE_ATOM: Y-m-d\TH:i:sP 2007-09-03T17:02:31+09:00
* DATE_COOKIE: l, d-M-y H:i:s T Monday, 03-Sep-07 17:02:31 JST
* DATE_ISO8601: Y-m-d\TH:i:sO 2007-09-03T17:02:31+0900
* DATE_RFC822: D, d M y H:i:s O Mon, 03 Sep 07 17:02:31 +0900
* DATE_RFC850: l, d-M-y H:i:s T Monday, 03-Sep-07 17:02:31 JST
* DATE_RFC1036: D, d M y H:i:s O Mon, 03 Sep 07 17:02:31 +0900
* DATE_RFC1123: D, d M Y H:i:s O Mon, 03 Sep 2007 17:02:31 +0900
* DATE_RFC2822: D, d M Y H:i:s O Mon, 03 Sep 2007 17:02:31 +0900
* DATE_RFC3339: Y-m-d\TH:i:sP 2007-09-03T17:02:31+09:00
* DATE_RSS: D, d M Y H:i:s O Mon, 03 Sep 2007 17:02:31 +0900
* DATE_W3C: Y-m-d\TH:i:sP 2007-09-03T17:02:31+09:00
*/
?>
いつも、Last-Modifiedなどを書き出す際にフォーマットを忘れていて悩むので、楽ができればうれしかったのですが、タイムゾーンなどのあたりで結局悩むような気がします。
という訳で、存在だけは覚えておく事にします。
HTTP周りの処理(?)はフレームワークなりライブラリなりに面倒を見させるのがよい気がしますが、ちょっとした実験用スクリプトの場合はついつい都度書き(?)になってしまっています。。。
というか、そろそろHTTPリクエストを受けつける必要があるスクリプトもPythonで書くようにしないとなぁ。ついつい、楽をしてPHPで書いてしまいます(悪い事ではないのですが)。
やっぱ、PHPは慣れと配備の楽さがあります。