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

目次

この節では 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"
    }