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"
各国ごとの表記法
説明 書式
アメリカ式の月、日 mm "/" dd "5/12", "10/27"
アメリカ式の月、日、年 mm "/" dd "/" y "12/22/78", "1/17/2006", "1/17/6"
スラッシュで区切られた、4桁の年、月、日 YY "/" mm "/" dd "2008/6/30", "1978/12/22"
4桁の年、月 (GNU) YY "-" mm "2008-6", "2008-06", "1978-12"
ハイフンで区切られた、年、月、日 y "-" mm "-" dd "2008-6-30", "78-12-22", "8-6-21"
ドットかタブかハイフンで区切られた、日、月、4桁の年 dd [.\t-] mm [.-] YY "30-6-2008", "22.12.1978"
ドットかタブで区切られた、日、月、2桁の年 dd [.\t] mm "." yy "30.6.08", "22\t12.78"
日、月の文字表記、年 dd ([ \t.-])* m ([ \t.-])* y "30-June 2008", "22DEC78", "14 III 1879"
月の文字表記、4桁の年 (日は1日にリセットされる) m ([ \t.-])* YY "June 2008", "DEC1978", "March 1879"
4桁の年、月の文字表記 (日は1日にリセットされる) YY ([ \t.-])* m "2008 June", "1978-XII", "1879.MArCH"
月の文字表記、日、年 m ([ .\t-])* dd [,.stndrh\t ]+ y "July 1st, 2008", "April 17, 1790", "May.9,78"
月の文字表記、日 m ([ .\t-])* dd [,.stndrh\t ]* "July 1st,", "Apr 17", "May.9"
日、月の文字表記 dd ([ .\t-])* m "1 July", "17 Apr", "9.May"
月の省略形、日、年 M "-" DD "-" y "May-09-78", "Apr-17-1790"
年、月の省略形、日 y "-" M "-" DD "78-Dec-22", "1814-MAY-17"
年 (年だけの指定) YY "1978", "2008"
年 (拡張表記、5-19 桁。符号付き) [+-] YYY "-81120", "+20192"
月の文字表記 (月だけの指定) m "March", "jun", "DEC"
ISO 8601 に準拠した表記法
説明 書式
年、月、日の8桁 YY MM DD "15810726", "19780417", "18140517"
スラッシュで区切られた、4桁の年、月、日 YY "/" MM "/" DD "2008/06/30", "1978/12/22"
ハイフンで区切られた、2桁の年、月、日 yy "-" MM "-" DD "08-06-30", "78-12-22"
符号つきまたは符号なしの4桁の年、月、日 [+-]? YY "-" MM "-" DD "-0002-07-26", "+1978-04-17", "1814-05-17"
符号が必須。5桁の年、月、日 [+-] YYY "-" MM "-" DD "-81120-02-26", "+20192-04-17"

注意:

シンボル y または yy を含む書式について、 100未満の年は特別な扱いになります。年が0から69までの間だった場合、 2000を足した数になります。 また、年が70から99までの間だった場合、1900を足した数になります。 つまり、"00-01-01" は "2000-01-01" と解釈されます。

注意:

書式「ドットかタブで区切られた、日、月、2桁の年」 (dd [.\t] mm "." yy) は年が61から99の間のときだけ機能します。 この範囲外の年を与えた場合には 時刻の書式 の "HH [.:] MM [.:] SS" が優先されます。

注意:

書式「年 (年だけの指定)」は、時刻の指定が先に出現している場合のみ機能します。 そうでない場合、指定された4桁は HH MM とみなされます。