LoginSignup
18
13

More than 5 years have passed since last update.

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

Posted at

前の投稿に頂いたコメントから「そういや制御コードで色指定できるな」経由「Windowsで実行するときcmdとGit Bushの識別できねぇかな」を試している最中に日付定数を見かけたので纏めてみる(なげぇ

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

どこで見かけた?

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

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

どう使うんですん?

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"との互換性がない。
下位互換性を保つため修正されていない。
"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 # 詳細不明 #

実装

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

//おやくそく
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);
18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13