中々触れる機会は無いと思いますが、HTTP汎用ヘッダーに使われる日付形式がやや特殊なためメモ。
最初のほうは仕様について書いています。コードが欲しい方は飛ばしてください。
RFC7231では、HTTPレスポンスヘッダで日付と時刻を表現するための書式が決められています。
実際のレスポンスの例
Date: Sun, 14 Jul 2019 15:00:00 GMT
Expires: Tue, 13 Aug 2019 15:00:00 GMT
Last-Modified: Mon, 03 Oct 2016 15:12:06 GMT
この構文は「IMF-fixdate」と呼ばれ、次のように決められています。
<曜日>, <日> <月> <年> <時>:<分>:<秒> GMT
IMF-fixdateは「RFC1123-date」とも呼ばれていますが、RFC1123から派生した書式であり、RFC1123とは異なります。
具体的には次のような違いがあります。
RFC1123の日付形式 の例
Sun, 8 Jul 2019 15:00:00 +0000
RFC1123は全体的にゆるめな印象です。
対照的なのがIMF-fixdateです。IMF-fixdateは固定長での表現を重視したため、複数の制限があります。
HTTPの日付形式(IMF-fixdate) の例
Sun, 08 Jul 2019 15:00:00 GMT
U+0020
1文字だけを入れなければなりません。なぜRFC1123の話をしたのかと言うと、PHPのDateTimeクラスには書式の定義済み変数が用意されているのですが、その中の「DATE_RFC1123」の書式がHTTPの時間表現と異なるため、利用することができないからです。
とは言え、基本構文は同じですので、最後の「+0000」形式を「GMT」に戻せばいいことになります。
PHPでは、date()をグリニッジ標準時として利用できる gmdate() という関数があります。
これを利用すると、次のようなコードでHTTPの日付形式を表現できます。
gmdate('D, d M Y H:i:s T')
出力は完全なHTTPの日付形式となります。
gmdate()は第二引数にUnixタイムスタンプを指定することができます。
header()とかで表記したいときはこのコードを使ってください。
引用・参考
Date - HTTP | MDN
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Date
RFC 7231 — HTTP/1.1: Semantics and Content (日本語訳)
https://triple-underscore.github.io/RFC7231-ja.html#http.date
rfc1123-date - suikawiki
https://wiki.suikawiki.org/n/rfc1123-date
PHP: DateTime - Manual
https://www.php.net/manual/ja/class.datetime.php#datetime.constants.types
PHP: gmdate - Manual
https://www.php.net/manual/ja/function.gmdate.php
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント