PHPのお勉強!

PHP TOP

サポートする日付と時刻の書式

この節では DateTimeImmutable, DateTime, date_create_immutable(), date_create(), date_parse() および strtotime() が解釈可能な、全てのBNFライクな書式について説明します。 これらの書式はセクションごとにグループ分けされています。 たいていの場合、一つの日付・時刻文字列の中でホワイトスペース、 コンマまたはドットで区切られた異なるセクションの書式を併用することができます。 それぞれの書式について、説明と一緒に1個以上の例を示してあります。 シングルクォートで囲まれたフォーマットは大文字小文字を区別しません。 ('t't とも T とも書けます)。 ダブルクォートで囲まれたフォーマットは大文字小文字を区別します。 ("T"T としか書けません)。

DateTimeImmutableDateTime オブジェクトをフォーマットするには、 DateTimeInterface::format() のドキュメントを参照ください。

以下の一般的なルールを考慮すべきです。

  1. 日付/時刻のパーサーは、 個別の単位(年月日時分秒)ごとに許される値の範囲を持っています。 年については4桁の数値、 月については 0-12。 日は 0-31、 時 は 0-24。分は 0-59 の範囲を持ちます。
  2. 秒に60を入れても構いません。 なぜなら、うるう秒を含んだ日付の文字列が現れる場合があるからです。 しかし、PHP は "60" を不正な秒として扱う UnixTime を実装しているため、 60 を入れるとオーバーフローします。
  3. strtotime() は、 いずれかの数値が範囲外の場合に false を返します。 DateTimeImmutable::__construct() はその場合に例外をスローします。
  4. 文字列が日付の場合、時刻に関する全ての要素は 0 にリセットされます。
  5. 時刻の一部が指定された文字列に含まれている場合、 重要でない時刻の要素は全て0にリセットされます。
  6. 日付/時刻のパーサーはお馬鹿なので、 高速にするためのチェックは行いません (そのため、より汎用的です)。
  7. 個別の時刻フォーマット以外にも、 日付/時刻のパーサーは 複合的な書式 を理解します。たとえば Unixタイムスタンプ (@1690388256) や、ISO の週番号 (2008-W28-3) などです。
  8. 不正な日付を渡していないかどうかについて、追加のチェックが行われます:

    <?php
    $res
    = date_parse("2015-09-31");
    var_dump($res["warnings"]);
    ?>

    上の例の出力は以下となります。

    array(1) {
      [11] =>
      string(27) "The parsed date was invalid"
    }
    

  9. エッジケースも処理できます。 ただ、処理するためには、 DateTimeImmutable::createFromFormat() を使い、正しいフォーマットを指定する必要があります。

    <?php
    $res
    = DateTimeImmutable::createFromFormat("Y-m-d", "2015-09-34");
    var_dump($res);

    上の例の出力は以下となります。

    object(DateTimeImmutable)#1 (3) {
      ["date"]=>
      string(26) "2015-10-04 17:24:43.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/London"
    }
    

時刻の書式

このページでは、 DateTimeImmutable, DateTime, date_create(), date_create_immutable(), そして strtotime() のパーサーが理解する、 BNFライクな時刻フォーマットを説明します。

DateTimeImmutableDateTime オブジェクトをフォーマットするには、 DateTimeInterface::format() のドキュメントを参照ください。

シンボル一覧
シンボル 書式
frac . [0-9]+ ".21342", ".85"
hh "0"?[1-9] | "1"[0-2] "04", "7", "12"
HH [01][0-9] | "2"[0-4] "04", "07", "19"
meridian [AaPp] .? [Mm] .? [\0\t ] "A.m.", "pM", "am."
MM [0-5][0-9] "00", "12", "59"
II [0-5][0-9] "00", "12", "59"
space [ \t]  
tz "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+ "CEST", "Europe/Amsterdam", "America/Indiana/Knox"
tzcorrection "GMT"? [+-] hh ":"? MM? "+0400", "GMT-07:00", "-07:00"
12時間制の表記
説明 書式
時、午前/午後 hh space? meridian "4 am", "5PM"
時、分、午前/午後 hh [.:] MM space? meridian "4:08 am", "7:19P.M."
時、分、秒、午前/午後 hh [.:] MM [.:] II space? meridian "4:08:37 am", "7:19:19P.M."
MS SQL (時、分、秒、端数、午前/午後) hh ":" MM ":" II [.:] [0-9]+ meridian "4:08:39:12313am"
24時間制の表記
説明 書式
時、分 't'? HH [.:] MM "04:08", "19.19", "T23:43"
時、分(コロンなし) 't'? HH MM "0408", "t1919", "T2343"
時、分、秒 't'? HH [.:] MM [.:] II "04.08.37", "t19:19:19"
時、分、秒(コロンなし) 't'? HH MM II "040837", "T191919"
時、分、秒、タイムゾーン 't'? HH [.:] MM [.:] II space? ( tzcorrection | tz ) "040837CEST", "T191919-0700"
時、分、秒、端数 't'? HH [.:] MM [.:] II frac "04.08.37.81412", "19:19:19.532453"
タイムゾーン tz | tzcorrection "CEST", "Europe/Amsterdam", "+0430", "GMT-06:00"

日付の書式

このページでは、 DateTimeImmutable, DateTime, date_create(), date_create_immutable() および strtotime() のパーサーが理解する、 BNFライクな日付フォーマットを説明します。

DateTimeImmutableDateTime オブジェクトをフォーマットするには、 DateTimeInterface::format() のドキュメントを参照ください。

シンボル一覧
シンボル 書式
daysuf "st" | "nd" | "rd" | "th"  
dd ([0-2]?[0-9] | "3"[01]) daysuf? "7th", "22nd", "31"
DD "0" [0-9] | [1-2][0-9] | "3" [01] "07", "31"
m 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII"  
M 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
mm "0"? [0-9] | "1"[0-2] "0", "04", "7", "12"
MM "0" [0-9] | "1"[0-2] "00", "04", "07", "12"
y [0-9]{1,4} "00", "78", "08", "8", "2008"
yy [0-9]{2} "00", "08", "78"
YY [0-9]{4} "2000", "2008", "1978"
YYY [0-9]{5,19} "81412", "20192"
各国ごとの表記法
説明 書式