PHPの日付書式の定義済み定数まとめ


[前の投稿に頂いたコメント](http://qiita.com/ProjectICKX/items/05e343fc762a93cda94a#comment-7bde5f7b043fae7bdc77)から「そういや制御コードで色指定できるな」経由「Windowsで実行するときcmdとGit Bushの識別できねぇかな」を試している最中に日付定数を見かけたので纏めてみる（なげぇ

実際の所、使い出があるのは"COOKIE"、"RSS"、"ATOM"くらいだろうけど。

# どこで見かけた？

$_SERVERを手始めにget_defined_vars()、get_defined_constants()を一覧として出力していた時に見かけた。

get_defined_constants()は時々見てみると一周回って新鮮な発見があるかもしれない。

# どう使うんですん？

```php
echo date(DATE_COOKIE), PHP_EOL;

// 今後を見越すとこちらのがお勧め
echo date(\DateTime::COOKIE), PHP_EOL;
```

# 定義済み定数一覧

概要についてはざっと検索してすぐ調べがついたものだけ書いてます。

| 書式名           | 定数名                | 書式             | 値                                 | クラス定数名                | 書式             | 値                                 | 概要                                                            | 備考                                                                                                                                                                              |
|:-----------------|:----------------------|:-----------------|:-----------------------------------|:----------------------------|:-----------------|:-----------------------------------|:----------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ATOM             | DATE_ATOM             | Y-m-d\TH:i:sP    | 2016-01-02T03:04:05+09:00          | \DateTime::ATOM             | Y-m-d\TH:i:sP    | 2016-01-02T03:04:05+09:00          | Atom Syndication Formatで使用される書式。RFC 4287で定義される。 |                                                                                                                                                                                   |
| COOKIE           | DATE_COOKIE           | l, d-M-Y H:i:s T | Saturday, 02-Jan-2016 03:04:05 JST | \DateTime::COOKIE           | l, d-M-Y H:i:s T | Saturday, 02-Jan-2016 03:04:05 JST | RFC 6265で定義されるクッキーの有効期限の書式                    |                                                                                                                                                                                   |
| ISO8601          | DATE_ISO8601          | Y-m-d\TH:i:sO    | 2016-01-02T03:04:05+0900           | \DateTime::ISO8601          | Y-m-d\TH:i:sO    | 2016-01-02T03:04:05+0900           | ISO 8601自体が日付と時刻の表記に関する国際規格。                | この書式は"ISO-8601"との互換性がない。 <br> 下位互換性を保つため修正されていない。 <br> "ISO-8601"互換の書式を使いたい場合は、"DateTime::ATOM"あるいは"DATE_ATOM"を使用すること。 |
| RFC822           | DATE_RFC822           | D, d M y H:i:s O | Sat, 02 Jan 16 03:04:05 +0900      | \DateTime::RFC822           | D, d M y H:i:s O | Sat, 02 Jan 16 03:04:05 +0900      | 電子メール交換で使用する書式。                                  | RFC 2822が策定されたため破棄された。                                                                                                                                              |
| RFC850           | DATE_RFC850           | l, d-M-y H:i:s T | Saturday, 02-Jan-16 03:04:05 JST   | \DateTime::RFC850           | l, d-M-y H:i:s T | Saturday, 02-Jan-16 03:04:05 JST   | USENETにおける標準書式                                          | これはインターネット標準ではありません。                                                                                                                                          |
| RFC1036          | DATE_RFC1036          | D, d M y H:i:s O | Sat, 02 Jan 16 03:04:05 +0900      | \DateTime::RFC1036          | D, d M y H:i:s O | Sat, 02 Jan 16 03:04:05 +0900      | USENETにおける標準書式                                          | これはインターネット標準ではありません。                                                                                                                                          |
| RFC1123          | DATE_RFC1123          | D, d M Y H:i:s O | Sat, 02 Jan 2016 03:04:05 +0900    | \DateTime::RFC1123          | D, d M Y H:i:s O | Sat, 02 Jan 2016 03:04:05 +0900    | FTPで使われる書式。                                             |                                                                                                                                                                                   |
| RFC2822          | DATE_RFC2822          | D, d M Y H:i:s O | Sat, 02 Jan 2016 03:04:05 +0900    | \DateTime::RFC2822          | D, d M Y H:i:s O | Sat, 02 Jan 2016 03:04:05 +0900    | RFCで使われる書式。                                             |                                                                                                                                                                                   |
| RFC3339          | DATE_RFC3339          | Y-m-d\TH:i:sP    | 2016-01-02T03:04:05+09:00          | \DateTime::RFC3339          | Y-m-d\TH:i:sP    | 2016-01-02T03:04:05+09:00          | グレゴリオ暦用の書式。                                          | ISO 8601標準のプロファイルであり、インターネット プロトコルで使用する日時の書式でもある。                                                                                         |
| RFC3339_EXTENDED | DATE_RFC3339_EXTENDED | Y-m-d\TH:i:s.vP  | 2016-01-02T03:04:05.000+09:00      | \DateTime::RFC3339_EXTENDED | Y-m-d\TH:i:s.vP  | 2016-01-02T03:04:05.000+09:00      | # 詳細不明 #                                                    |                                                                                                                                                                                   |
| RSS              | DATE_RSS              | D, d M Y H:i:s O | Sat, 02 Jan 2016 03:04:05 +0900    | \DateTime::RSS              | D, d M Y H:i:s O | Sat, 02 Jan 2016 03:04:05 +0900    | RSSで使われる書式。                                             |                                                                                                                                                                                   |
| W3C              | DATE_W3C              | Y-m-d\TH:i:sP    | 2016-01-02T03:04:05+09:00          | \DateTime::W3C              | Y-m-d\TH:i:sP    | 2016-01-02T03:04:05+09:00          | # 詳細不明 #                                                    |                                                                                                                                                                                   |

# 実装

こんな感じで表を作ってみた。

```php
//おやくそく
date_default_timezone_set('Asia/Tokyo');

$time_stamp = strtotime('2016-01-02 03:04:05');

$date_formats = [
	'ATOM'				=> ['Atom Syndication Formatで使用される書式。RFC 4287で定義される。'],
	'COOKIE'			=> ['RFC 6265で定義されるクッキーの有効期限の書式'],
	'ISO8601'			=> ['ISO 8601自体が日付と時刻の表記に関する国際規格。', 'この書式は"ISO-8601"との互換性がない。 <br> 下位互換性を保つため修正されていない。 <br> "ISO-8601"互換の書式を使いたい場合は、"DateTime::ATOM"あるいは"DATE_ATOM"を使用すること。'],
	'RFC822'			=> ['電子メール交換で使用する書式。', 'RFC 2822が策定されたため破棄された。'],
	'RFC850'			=> ['USENETにおける標準書式', 'これはインターネット標準ではありません。'],
	'RFC1036'			=> ['USENETにおける標準書式', 'これはインターネット標準ではありません。'],
	'RFC1123'			=> ['FTPで使われる書式。'],
	'RFC2822'			=> ['RFCで使われる書式。'],
	'RFC3339'			=> ['グレゴリオ暦用の書式。', 'ISO 8601標準のプロファイルであり、インターネット プロトコルで使用する日時の書式でもある。'],
	'RFC3339_EXTENDED'	=> ['# 詳細不明 #'],
	'RSS'				=> ['RSSで使われる書式。'],
	'W3C'				=> ['# 詳細不明 #'],
];

$ret = [
	[
		'書式名',
		'定数名',
		'書式',
		'値',
		'クラス定数名',
		'書式',
		'値',
		'概要',
		'備考',
	],
];

foreach ($date_formats as $date_format_name => $messages) {
	$const_name = sprintf('DATE_%s', $date_format_name);
	$class_const_name = sprintf('\DateTime::%s', $date_format_name);
	$ret[] = [
		$date_format_name,
		$const_name,
		constant($const_name),
		date(constant($const_name), $time_stamp),
		$class_const_name,
		constant($class_const_name),
		date(constant($class_const_name), $time_stamp),
		$messages[0],
		isset($messages[1]) ? $messages[1] : '',
	];
}

$widht_bufferr = array_fill(0, count(current($ret)), 0);

foreach ($ret as $row) {
	foreach ($row as $idx => $col) {
		$str_width = mb_strwidth($col);
		$widht_bufferr[$idx] >= $str_width ?: $widht_bufferr[$idx] = $str_width;
	}
}

$mp = fopen('php://memory', 'bw+');

$header = array_shift($ret);
foreach ($header as $idx => $head) {
	$header[$idx] = $head . str_repeat(' ', $widht_bufferr[$idx] - mb_strwidth($head));
}
fwrite($mp, sprintf('| %s |', implode(' | ', $header)));
fwrite($mp, PHP_EOL);

$separator = [];
foreach ($widht_bufferr as $width) {
	$separator[] = str_repeat('-', $width);
}
fwrite($mp, sprintf('|:%s-|', implode('-|:', $separator)));
fwrite($mp, PHP_EOL);

foreach ($ret as $row) {
	$body = [];
	foreach ($row as $idx => $col) {
		$body[$idx] = $col . str_repeat(' ', $widht_bufferr[$idx] - mb_strwidth($col));
	}
	fwrite($mp, sprintf('| %s |', implode(' | ', $body)));
	fwrite($mp, PHP_EOL);
}

rewind($mp);
$table = stream_get_contents($mp);

echo $table;

file_put_contents('ret.txt', $table);
```