<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.datetimeimmutable.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'datetimeimmutable.createfromformat.php',
    1 => 'DateTimeImmutable::createFromFormat',
    2 => '時刻の文字列を指定されたフォーマットに従ってパースする',
  ),
  'up' => 
  array (
    0 => 'class.datetimeimmutable.php',
    1 => 'DateTimeImmutable',
  ),
  'prev' => 
  array (
    0 => 'datetimeimmutable.construct.php',
    1 => 'DateTimeImmutable::__construct',
  ),
  'next' => 
  array (
    0 => 'datetimeimmutable.createfrominterface.php',
    1 => 'DateTimeImmutable::createFromInterface',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/datetime/datetimeimmutable/createfromformat.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="datetimeimmutable.createfromformat" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">DateTimeImmutable::createFromFormat</h1>
  <h1 class="refname">date_create_immutable_from_format</h1>
  <p class="verinfo">(PHP 5 &gt;= 5.5.0, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">DateTimeImmutable::createFromFormat</span> -- <span class="refname">date_create_immutable_from_format</span> &mdash; <span class="dc-title">時刻の文字列を指定されたフォーマットに従ってパースする</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-datetimeimmutable.createfromformat-description">
  <h3 class="title">説明</h3>
  <p class="para">オブジェクト指向型</p>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="modifier">static</span> <span class="methodname"><strong>DateTimeImmutable::createFromFormat</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$format</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$datetime</code></span>, <span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="class.datetimezone.php" class="type DateTimeZone">DateTimeZone</a></span></span> <code class="parameter">$timezone</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>): <span class="type"><span class="type"><a href="class.datetimeimmutable.php" class="type DateTimeImmutable">DateTimeImmutable</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">手続き型</p>
  <div class="methodsynopsis dc-description"><span class="methodname"><a href="function.date-create-immutable-from-format.php" class="methodname">date_create_immutable_from_format</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$format</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$datetime</code></span>, <span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="class.datetimezone.php" class="type DateTimeZone">DateTimeZone</a></span></span> <code class="parameter">$timezone</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>): <span class="type"><span class="type"><a href="class.datetimeimmutable.php" class="type DateTimeImmutable">DateTimeImmutable</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   新しい DateTimeImmutable オブジェクトを返します。
   このオブジェクトは、<code class="parameter">datetime</code> で指定した文字列を
   <code class="parameter">format</code> で指定した書式に沿って解釈した時刻を表します。
  </p>
 </div>


 <div class="refsect1 parameters" id="datetimeimmutable.createfromformat.parameters">
  <h3 class="title">パラメータ</h3>
  <dl>
   
    <dt><code class="parameter">format</code></dt>
    <dd>
     <p class="para">
      書式を文字列で渡します。以下の書式オプションを参照ください。
      大半は、<span class="function"><a href="function.date.php" class="function">date()</a></span> で使える文字と同じです。
     </p>
     <p class="para">
      全てのフィールドは現在の日付/時刻で初期化されます。
      ほとんどの場合、これらの値を &quot;ゼロ&quot; (Unix タイムのエポック
      <code class="literal">1970-01-01 00:00:00 UTC</code>) でリセットしたいはずです。
      これは、<code class="parameter">format</code> の最初の文字に
      <code class="literal">!</code> を入れるか、
      最後の文字に <code class="literal">|</code> を入れることで実現できます。
      詳細な情報は、以下で示すそれぞれの文字に関するドキュメントを参照ください。
     </p>
     <p class="para">
      フォーマットの解釈は左から右に行われます。
      これは、フォーマット文字が現れる順番が結果に影響する場合があるということです。
      たとえば <code class="literal">z</code>(1年における何番目の日か)　の場合、
      <code class="literal">Y</code> や <code class="literal">y</code>
      を使って年が既にパースされた後に使わなければなりません。
     </p>
     <p class="para">
      数値の解釈に使われる文字については、広範な値が許されています。
      これには、論理的に許される範囲以上のものも含みます。
      たとえば、<code class="literal">d</code> (ある月における何番目の日か) の場合、
      <code class="literal">00</code> から <code class="literal">99</code>
      までの値が許されています。これに対する唯一の制約は、桁数のみです。
      範囲外の値が指定された場合、
      日付/時刻のパーサーのオーバーフローの仕組みが使われます。
      オーバーフローのふるまいについては、
      後にいくつかのサンプルを示します。
     </p>
     <p class="para">
      データは、フォーマット文字に従って貪欲にパースされます。
      つまり、そのフォーマットが許している最大の長さまで読みこまれます。
      これによって、次のフォーマット文字に十分な文字数が <code class="parameter">datetime</code> にもう残っていないことがありえます。
      このことが引き起こす問題については、このページのサンプルでも触れます。
     </p>
     <p class="para">
      <table class="doctable table">
       <caption><strong><code class="parameter">format</code> パラメータに渡せる文字</strong></caption>
       
        <thead>
         <tr>
          <th><code class="parameter">format</code> 文字</th>
          <th>説明</th>
          <th>取りうる値の例</th>
         </tr>

        </thead>

        <tbody class="tbody">
         <tr>
          <td style="text-align: center;"><em>日</em></td>
          <td>---</td>
          <td>---</td>
         </tr>

         <tr>
          <td><code class="literal">d</code> および <code class="literal">j</code></td>
          <td>2桁の日付。先頭のゼロを含むものと含まないもの</td>
          <td>
           <code class="literal">01</code> から <code class="literal">31</code> あるいは
           <code class="literal">1</code> から <code class="literal">31</code>
           (その月の日数分以上の2桁の数値も指定可能ですが、
           その月はオーバーフローします。
           たとえば January において 33 を指定した場合、
           February 2nd という意味になります)
          </td>
         </tr>

         <tr>
          <td><code class="literal">D</code> および <code class="literal">l</code></td>
          <td>曜日を表す文字列</td>
          <td>
           <code class="literal">Mon</code> から <code class="literal">Sun</code> あるいは
           <code class="literal">Sunday</code> から <code class="literal">Saturday</code>。
           指定された曜日が、パースされた(またはデフォルトの)日付と異なっていた場合、
           指定された曜日の <em>次の</em>
           日にオーバーフローします。詳細は後に示すサンプルを参照ください。
          </td>
         </tr>

         <tr>
          <td><code class="literal">S</code></td>
          <td>日付の後につける英語の接尾辞。二文字。処理中には無視されます。</td>
          <td>
           <code class="literal">st</code>、<code class="literal">nd</code>、<code class="literal">rd</code> あるいは
           <code class="literal">th</code>
          </td>
         </tr>

         <tr>
          <td><code class="literal">z</code></td>
          <td>
            年始からの通算日数 (最初は 0)。
            <code class="literal">Y</code> または <code class="literal">y</code>
            の後に続けて置かなければいけません。
          </td>
          <td>
           <code class="literal">0</code> から <code class="literal">365</code>
           (1年の日数分以上の3桁の数値も指定可能ですが、
           その年はオーバーフローします。
           たとえば 2022年において <code class="literal">366</code>
           を指定した場合は、
           January 2nd, 2023 という意味になります)
          </td>
         </tr>

         <tr>
          <td style="text-align: center;"><em>月</em></td>
          <td>---</td>
          <td>---</td>
         </tr>

         <tr>
          <td><code class="literal">F</code> および <code class="literal">M</code></td>
          <td>月を表す文字列。January あるいは Sept など</td>
          <td>
           <code class="literal">January</code> から <code class="literal">December</code> あるいは
           <code class="literal">Jan</code> から <code class="literal">Dec</code>
          </td>
         </tr>

         <tr>
          <td><code class="literal">m</code> および <code class="literal">n</code></td>
          <td>月を表す数値。先頭のゼロを含むものと含まないもの</td>
          <td>
           <code class="literal">01</code> から <code class="literal">12</code> あるいは
           <code class="literal">1</code> から <code class="literal">12</code>
           (12 以上の2桁の数値も指定可能ですが、
           その年についてはオーバーフローします。
           たとえば <code class="literal">13</code> の場合は、
           翌年の1月という意味になります)
          </td>
         </tr>

         <tr>
          <td style="text-align: center;"><em>年</em></td>
          <td>---</td>
          <td>---</td>
         </tr>

         <tr>
          <td><code class="literal">X</code> および <code class="literal">x</code></td>
          <td>年の数値表現。19桁<em>まで</em>指定可能。オプションで <code class="literal">+</code> や <code class="literal">-</code> を先頭に指定可能です。</td>
          <td>例: <code class="literal">0055</code>, <code class="literal">787</code>,
           <code class="literal">1999</code>, <code class="literal">-2003</code>,
           <code class="literal">+10191</code></td>
         </tr>

         <tr>
          <td><code class="literal">Y</code></td>
          <td>4 桁<em>まで</em>の数値で表した年</td>
          <td>例: <code class="literal">25</code> (<code class="literal">0025</code> と同じ),
           <code class="literal">787</code>, <code class="literal">1999</code>, <code class="literal">2003</code></td>
         </tr>

         <tr>
          <td><code class="literal">y</code></td>
          <td>
           2 桁の数値で表した年 (1970年から2069年の間だとみなされます)
          </td>
          <td>
           例:
           <code class="literal">99</code> あるいは <code class="literal">03</code>
           (それぞれ、 <code class="literal">1999</code> および
           <code class="literal">2003</code> と見なされます)
          </td>
         </tr>

         <tr>
          <td style="text-align: center;"><em>時刻</em></td>
          <td>---</td>
          <td>---</td>
         </tr>

         <tr>
          <td><code class="literal">a</code> および <code class="literal">A</code></td>
          <td>午前および午後</td>
          <td><code class="literal">am</code> あるいは <code class="literal">pm</code></td>
         </tr>

         <tr>
          <td><code class="literal">g</code> および <code class="literal">h</code></td>
          <td>12 時間制での時間。先頭のゼロを含むものと含まないもの</td>
          <td>
           <code class="literal">1</code> から <code class="literal">12</code> あるいは
           <code class="literal">01</code> から <code class="literal">12</code>
           (12 以上の2桁の数値も指定可能ですが、
           日の指定がオーバーフローします。
           たとえば <code class="literal">14</code> の場合は、
           次の午前/午後の <code class="literal">02</code> 時という意味になります)
          </td>
         </tr>

         <tr>
          <td><code class="literal">G</code> および <code class="literal">H</code></td>
          <td>24 時間制での時間。先頭のゼロを含むものと含まないもの</td>
          <td>
           <code class="literal">0</code> から <code class="literal">23</code>、あるいは
           <code class="literal">00</code> から <code class="literal">23</code>
           (24 より大きな、2桁の値も指定可能ですが、
           この場合、日の指定がオーバーフローします。
           たとえば、<code class="literal">26</code> は翌日の
           <code class="literal">02:00</code> という意味になります)
          </td>
         </tr>

         <tr>
          <td><code class="literal">i</code></td>
          <td>分。先頭のゼロを含む</td>
          <td>
           <code class="literal">00</code> から <code class="literal">59</code>
           (59 以上の2桁の数値も指定可能ですが、
           次の1時間にオーバーフローします。
           たとえば <code class="literal">66</code> の場合は、
           次の1時間の <code class="literal">:06</code> という意味になります)
          </td>
         </tr>

         <tr>
          <td><code class="literal">s</code></td>
          <td>秒。先頭のゼロを含む</td>
          <td>
           <code class="literal">00</code> から <code class="literal">59</code>
           (59 以上の2桁の数値も指定可能ですが、
           次の分にオーバーフローします。
           たとえば <code class="literal">90</code> の場合は、
           次の分の <code class="literal">:30</code> という意味になります)
          </td>
         </tr>

         <tr>
          <td><code class="literal">v</code></td>
          <td>ミリ秒 (最大 3桁)</td>
          <td>例: <code class="literal">12</code> (<code class="literal">0.12</code>
          秒という意味), <code class="literal">345</code> (<code class="literal">0.345</code> 秒という意味)</td>
         </tr>

         <tr>
          <td><code class="literal">u</code></td>
          <td>マイクロ秒 (最大 6 桁)</td>
          <td>例: <code class="literal">45</code> (<code class="literal">0.45</code>
          秒という意味), <code class="literal">654321</code> (<code class="literal">0.654321</code> 秒という意味)</td>
         </tr>

         <tr>
          <td style="text-align: center;"><em>タイムゾーン</em></td>
          <td>---</td>
          <td>---</td>
         </tr>

         <tr>
          <td>
           <code class="literal">e</code>, <code class="literal">O</code>, <code class="literal">p</code>,
           <code class="literal">P</code> および <code class="literal">T</code>
          </td>
          <td>タイムゾーン識別子、UTC からの時差 (時間単位)、
          UTC からの時差 (コロン区切りでの時間と分)、そしてタイムゾーンの短縮形</td>
          <td>例: <code class="literal">UTC</code>、<code class="literal">GMT</code>、
           <code class="literal">Atlantic/Azores</code>、
           <code class="literal">+0200</code>、<code class="literal">+02:00</code>、
           <code class="literal">EST</code>、<code class="literal">MDT</code>
          </td>
         </tr>

         <tr>
          <td style="text-align: center;"><em>完全な日付/時刻</em></td>
          <td>---</td>
          <td>---</td>
         </tr>

         <tr>
          <td><code class="literal">U</code></td>
          <td>Unix エポック (January 1 1970 00:00:00 GMT) からの経過秒数</td>
          <td>例: <code class="literal">1292177455</code></td>
         </tr>

         <tr>
          <td style="text-align: center;"><em>空白および区切り</em></td>
          <td>---</td>
          <td>---</td>
         </tr>

         <tr>
          <td><code class="literal"> </code> (空白)</td>
          <td>ゼロ文字以上のスペース、タブ、NBSP(U+A0)、NNBSP(U+202F)</td>
          <td>例: <code class="literal">&quot;\t&quot;</code>, <code class="literal">&quot;  &quot;</code></td>
         </tr>

         <tr>
          <td><code class="literal">#</code></td>
          <td>
           次の区切り文字のいずれか: <code class="literal">;</code>,
           <code class="literal">:</code>, <code class="literal">/</code>, <code class="literal">.</code>,
           <code class="literal">,</code>, <code class="literal">-</code>, <code class="literal">(</code>,
           <code class="literal">)</code>
          </td>
          <td>例: <code class="literal">/</code></td>
         </tr>

         <tr>
          <td>
           <code class="literal">;</code>,
           <code class="literal">:</code>, <code class="literal">/</code>, <code class="literal">.</code>,
           <code class="literal">,</code>, <code class="literal">-</code>, <code class="literal">(</code>,
           <code class="literal">)</code>
          </td>
          <td>指定した文字</td>
          <td>例: <code class="literal">-</code></td>
         </tr>

         <tr>
          <td><code class="literal">?</code></td>
          <td>ランダムなバイト</td>
          <td>例: <code class="literal">^</code> (UTF-8 文字の場合は複数の
          <code class="literal">?</code> が必要になるでしょう。この場合、おそらく
          <code class="literal">*</code> を使うと要望が満たせるはずです)</td>
         </tr>

         <tr>
          <td><code class="literal">*</code></td>
          <td>次の区切り文字あるいは数字までのランダムなバイト列</td>
          <td>例: <code class="literal">Y-*-d</code> の中の <code class="literal">*</code>
          は、文字列 <code class="literal">2009-aWord-08</code> の中の
          <code class="literal">aWord</code> にマッチします</td>
         </tr>

         <tr>
          <td><code class="literal">!</code></td>
          <td>
           すべてのフィールド
           (年、月、日、時、分、秒、マイクロ秒およびタイムゾーン情報)
           を ゼロ相当の値
           (時、分、秒、マイクロ秒については <code class="literal">0</code>。
           月、日については <code class="literal">1</code>。
           年については <code class="literal">1970</code>。
           タイムゾーンについてはデフォルトのタイムゾーン)
           にリセットします。
          </td>
          <td><code class="literal">!</code> がなければ、すべてのフィールドは現在の日時に設定されます。</td>
         </tr>

         <tr>
          <td><code class="literal">|</code></td>
          <td>まだパースされていないすべてのフィールド (年、月、日、時、分、秒、マイクロ秒およびタイムゾーン情報)
          を ゼロ相当の値にリセットします。</td>
          <td><code class="literal">Y-m-d|</code> は、文字列をパースした結果から年月日を設定し
          時分秒には 0 を設定します。</td>
         </tr>

         <tr>
          <td><code class="literal">+</code></td>
          <td>この文字があると、文字列のそれ以降のデータではエラーが発生せず、
          かわりに警告を発生させる</td>
          <td>それ以降のデータが存在したかどうかを調べるには <span class="methodname"><a href="datetime.getlasterrors.php" class="methodname">DateTime::getLastErrors()</a></span>
          を使います。</td>
         </tr>

        </tbody>
       
      </table>

     </p>
     <p class="para">
      書式文字列の中に解釈不能な文字が含まれていると処理は失敗し、
      戻り値にはエラーメッセージが付加されます。エラーメッセージを調べるには
      <span class="methodname"><a href="datetime.getlasterrors.php" class="methodname">DateTime::getLastErrors()</a></span> を使います。
     </p>
     <p class="para">
      <code class="parameter">format</code> にリテラル文字を含めるには、
      バックスラッシュ (<code class="literal">\</code>) でエスケープする必要があります。
     </p>
     <p class="para">
      <code class="parameter">format</code> に文字
      <code class="literal">!</code> が含まれない場合は、作成した時刻値のうち
      <code class="parameter">format</code> で指定されていない部分を
      現在のシステム時刻で初期化します。
     </p>
     <p class="para">
      <code class="parameter">format</code> に文字
      <code class="literal">!</code> が含まれる場合は、作成した時刻値のうち
      <code class="parameter">format</code> で指定されていない部分と
      <code class="literal">!</code> の左側の部分を
      Unix エポックの対応する箇所の値で初期化します。
     </p>
     <p class="para">
      Unix エポックは 1970-01-01 00:00:00 です。
     </p>
    </dd>
   
   
    <dt><code class="parameter">datetime</code></dt>
    <dd>
     <p class="para">
      時刻を表す文字列。
     </p>
    </dd>
   
   
    <dt><code class="parameter">timezone</code></dt>
    <dd>
     <p class="para">
      指定したいタイムゾーンを表す
      <span class="classname"><a href="class.datetimezone.php" class="classname">DateTimeZone</a></span> オブジェクト。
     </p>
     <p class="para">
      <code class="parameter">timezone</code> を省略されるか、または <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> の場合、
      かつ <code class="parameter">datetime</code> にタイムゾーンが含まれない場合は、
      現在のタイムゾーンを使います。
     </p>
     <blockquote class="note"><p><strong class="note">注意</strong>: 
      <p class="para">
       <code class="parameter">datetime</code> パラメータが UNIX タイムスタンプ
       (例: <code class="literal">946684800</code>) だったり、タイムゾーンを含んでいたり
       (例: <code class="literal">2010-01-28T15:00:00+02:00</code>)
       する場合は、
       <code class="parameter">timezone</code> パラメータや現在のタイムゾーンは無視します。
      </p>
     </p></blockquote>
    </dd>
   
  </dl>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-datetimeimmutable.createfromformat-returnvalues">
  <h3 class="title">戻り値</h3>
  <p class="para">
   新しい DateTimeImmutable のインスタンスを返します。
   失敗した場合に <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返します.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-datetimeimmutable.createfromformat-errors">
  <h3 class="title">エラー / 例外</h3>
  <p class="para">
   <code class="parameter">datetime</code> に NULLバイトが含まれている場合は、
   <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> がスローされます。
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-datetimeimmutable.createfromformat-changelog">
  <h3 class="title">変更履歴</h3>
  <p class="para">
   <table class="doctable informaltable">
    
     <thead>
      <tr>
       <th>バージョン</th>
       <th>説明</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>8.2.9</td>
       <td>
        <code class="literal"> </code> (空白) 文字は、
        新たに NBSP(U+A0) と NNBSP(U+202F) をサポートするようになりました。
       </td>
      </tr>

      <tr>
       <td>8.2.0</td>
       <td>
        <code class="parameter">format</code> に指定できる文字に、
        <code class="literal">X</code> と <code class="literal">x</code> が追加されました。
       </td>
      </tr>

      <tr>
       <td>8.0.21, 8.1.8, 8.2.0</td>
       <td>
        <code class="parameter">datetime</code> に NULLバイトが含まれている場合は、
        <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> がスローされるようになりました。
        これより前のバージョンでは、こうした値は静かに無視されていました。
       </td>
      </tr>

      <tr>
       <td>7.3.0</td>
       <td>
        <code class="parameter">format</code> に指定できる文字に、
        <code class="literal">v</code> が追加されました。
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-datetimeimmutable.createfromformat-examples">
  <h3 class="title">例</h3>
  <div class="example" id="example-1">
   <p><strong>例1 <span class="function"><strong>DateTimeImmutable::createFromFormat()</strong></span> の例</strong></p>
   <div class="example-contents"><p>オブジェクト指向型</p></div>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #DD0000">'j-M-Y'</span><span style="color: #007700">, </span><span style="color: #DD0000">'15-Feb-2009'</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d'</span><span style="color: #007700">);</span></span></code></div>
   </div>

  </div>

  <div class="example" id="example-2">
   <p><strong>例2 定義済みのフォーマットの定数を <span class="function"><strong>DateTimeImmutable::createFromFormat()</strong></span> で使う</strong></p>
   <div class="example-contents"><p>オブジェクト指向型</p></div>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">DateTimeInterface</span><span style="color: #007700">::</span><span style="color: #0000BB">ISO8601</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'2004-02-12T15:19:21+00:00'<br /></span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'c e'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">DateTimeInterface</span><span style="color: #007700">::</span><span style="color: #0000BB">RFC3339_EXTENDED</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'2013-10-14T09:00:00.000+02:00'<br /></span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'c e'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;</span></span></code></div>
   </div>

   <div class="example-contents"><p>
    この例で使われている
    <a href="class.datetimeinterface.php#datetimeinterface.constants.types" class="link">定義済みの定数</a>
    は、<span class="classname"><a href="class.datetimeimmutable.php" class="classname">DateTimeImmutable</a></span> の
    <a href="datetime.format.php" class="link">フォーマット</a> 文字からなる文字列です。
    ほとんどの場合、それらのフォーマット文字は 上の <a href="" class="link">パラメータ</a>
    で定義されている 日付/時刻 の要素とマッチしますが、
    カバーしている範囲は狭いです。
   </p></div>
  </div>

  <div class="example" id="example-3">
   <p><strong>例3 <span class="function"><strong>DateTimeImmutable::createFromFormat()</strong></span> の複雑な例</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">'Current time: ' </span><span style="color: #007700">. </span><span style="color: #0000BB">date</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$format </span><span style="color: #007700">= </span><span style="color: #DD0000">'Y-m-d'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #DD0000">'2009-02-15'</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Format: </span><span style="color: #0000BB">$format</span><span style="color: #DD0000">; " </span><span style="color: #007700">. </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$format </span><span style="color: #007700">= </span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #DD0000">'2009-02-15 15:16:17'</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Format: </span><span style="color: #0000BB">$format</span><span style="color: #DD0000">; " </span><span style="color: #007700">. </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$format </span><span style="color: #007700">= </span><span style="color: #DD0000">'Y-m-!d H:i:s'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #DD0000">'2009-02-15 15:16:17'</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Format: </span><span style="color: #0000BB">$format</span><span style="color: #DD0000">; " </span><span style="color: #007700">. </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$format </span><span style="color: #007700">= </span><span style="color: #DD0000">'!d'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #DD0000">'15'</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Format: </span><span style="color: #0000BB">$format</span><span style="color: #DD0000">; " </span><span style="color: #007700">. </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$format </span><span style="color: #007700">= </span><span style="color: #DD0000">'i'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$date </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #0000BB">$format</span><span style="color: #007700">, </span><span style="color: #DD0000">'15'</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Format: </span><span style="color: #0000BB">$format</span><span style="color: #DD0000">; " </span><span style="color: #007700">. </span><span style="color: #0000BB">$date</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は、
たとえば以下のようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">Current time: 2022-06-02 15:50:46
Format: Y-m-d; 2009-02-15 15:50:46
Format: Y-m-d H:i:s; 2009-02-15 15:16:17
Format: Y-m-!d H:i:s; 1970-01-15 15:16:17
Format: !d; 1970-01-15 00:00:00
Format: i; 2022-06-02 00:15:00</pre>
</div>
   </div>
  </div>
  <div class="example" id="example-4">
   <p><strong>例4 リテラル文字を含む書式文字列</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #DD0000">'H\h i\m s\s'</span><span style="color: #007700">,</span><span style="color: #DD0000">'23h 15m 03s'</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'H:i:s'</span><span style="color: #007700">);</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は、
たとえば以下のようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">23:15:03</pre>
</div>
   </div>
  </div>

  <div class="example" id="example-5">
   <p><strong>例5 オーバーフローした際のふるまい</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">, </span><span style="color: #DD0000">'2021-17-35 16:60:97'</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">RFC2822</span><span style="color: #007700">);</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は、
たとえば以下のようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">Sat, 04 Jun 2022 17:01:37 +0000</pre>
</div>
   </div>
   <div class="example-contents"><p>
    上の結果は奇妙に見えますが、正しい動作です。
    なぜなら、以下のようなオーバーフローが発生しているからです:
   </p></div>
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      <code class="literal">97</code> 秒は <code class="literal">1</code> 分オーバーフローしており、<code class="literal">37</code> 秒が残ります。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">61</code> 分は <code class="literal">1</code> 時間オーバーフローしており、<code class="literal">1</code> 分が残ります。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">35</code> 日は、<code class="literal">1</code> ヶ月分オーバーフローしており、<code class="literal">4</code> 日が残ります。
      どれだけの日が残るかは月に依存します。
      なぜなら、すべての月が同じ日数を持つとは限らないからです。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">18</code> ヶ月は、<code class="literal">1</code> 年分オーバーフローしており、<code class="literal">6</code> ヶ月が残ります。
     </span>
    </li>
   </ol>
  </div>

  <div class="example" id="example-6">
   <p><strong>例6 曜日がオーバーフローした場合のふるまい</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$d </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #0000BB">DateTimeInterface</span><span style="color: #007700">::</span><span style="color: #0000BB">RFC1123</span><span style="color: #007700">, </span><span style="color: #DD0000">'Mon, 3 Aug 2020 25:00:00 +0000'</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$d</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #0000BB">DateTime</span><span style="color: #007700">::</span><span style="color: #0000BB">RFC1123</span><span style="color: #007700">), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は、
たとえば以下のようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">Mon, 10 Aug 2020 01:00:00 +0000</pre>
</div>
   </div>
   <div class="example-contents"><p>
    上の結果は奇妙に見えますが、正しい動作です。
    なぜなら、以下のようなオーバーフローが発生しているからです:
   </p></div>
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      <code class="literal">3 Aug 2020 25:00:00</code> はオーバーフローしており、<code class="literal">(Tue) 4 Aug
      2020 01:00</code> となります。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">Mon</code> が適用されます。
      これは、日付が <code class="literal">Mon, 10 Aug 2020 01:00:00</code> まで進むからです。
      <code class="literal">Mon</code> のような相対的なキーワード指定については、
      <a href="datetime.formats.php#datetime.formats.relative" class="link">相対的な書式</a> で説明されています。
     </span>
    </li>
   </ol>
  </div>

  <p class="para">
   日付のオーバーフローを検出するために、
   <span class="methodname"><a href="datetimeimmutable.getlasterrors.php" class="methodname">DateTimeImmutable::getLastErrors()</a></span> 
   が使えます。
   このメソッドの結果には、オーバーフローが発生した場合に警告が含まれます。
  </p>
  <div class="example" id="example-7">
   <p><strong>例7 オーバーフローした日付を検出する</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$d </span><span style="color: #007700">= </span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">createFromFormat</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y-m-d H:i:s'</span><span style="color: #007700">, </span><span style="color: #DD0000">'2021-17-35 16:60:97'</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$d</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">RFC2822</span><span style="color: #007700">), </span><span style="color: #DD0000">"\n\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">DateTimeImmutable</span><span style="color: #007700">::</span><span style="color: #0000BB">getLastErrors</span><span style="color: #007700">());</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は、
たとえば以下のようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">Sat, 04 Jun 2022 17:01:37 +0000

array(4) {
  &#039;warning_count&#039; =&gt;
  int(2)
  &#039;warnings&#039; =&gt;
  array(1) {
    [19] =&gt;
    string(27) &quot;The parsed date was invalid&quot;
  }
  &#039;error_count&#039; =&gt;
  int(0)
  &#039;errors&#039; =&gt;
  array(0) {
  }
}</pre>
</div>
   </div>
  </div>

  <div class="example" id="example-8">
   <p><strong>例8 貪欲なパースの振る舞い</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">date_parse_from_format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Gis'</span><span style="color: #007700">, </span><span style="color: #DD0000">'60101'</span><span style="color: #007700">));</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は、
たとえば以下のようになります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">Array
(
    [year] =&gt;
    [month] =&gt;
    [day] =&gt;
    [hour] =&gt; 60
    [minute] =&gt; 10
    [second] =&gt; 0
    [fraction] =&gt; 0
    [warning_count] =&gt; 1
    [warnings] =&gt; Array
        (
            [5] =&gt; The parsed time was invalid
        )

    [error_count] =&gt; 1
    [errors] =&gt; Array
        (
            [4] =&gt; A two digit second could not be found
        )

    [is_localtime] =&gt;
)</pre>
</div>
   </div>
   <div class="example-contents"><p>
    フォーマット文字 <code class="literal">G</code> は、
    24時間制での時間をパースします。
    先頭のゼロを含んでいても、含まなくてもパースを行います。
    このフォーマットは、1桁か2桁の数値が必要ですが、
    2桁の数値が存在するので、ここでは貪欲に <code class="literal">60</code> を読み込みます。
   </p></div>
   <div class="example-contents"><p>
    その後に続く <code class="literal">i</code> と <code class="literal">s</code>
    フォーマット文字は、両方2桁の数値が必要です。
    つまり、<code class="literal">10</code> が (フォーマット文字 <code class="literal">i</code> の) 分として渡されるので、
    (フォーマット文字 <code class="literal">s</code> の) 秒としてパースする十分な桁数が残っていません。
   </p></div>
   <div class="example-contents"><p>
    配列の <code class="literal">errors</code> キーの内容が、
    この問題を説明しています。
   </p></div>
   <div class="example-contents"><p>
    さらに、24時間制の時は、
    <code class="literal">0</code>-<code class="literal">24</code> の範囲であるため、
    <code class="literal">60</code> は範囲外の値です。
    よって、<code class="literal">warnings</code> キーに、
    指定された時間が正しくない旨の警告が含まれています。
   </p></div>
  </div>

 </div>


 <div class="refsect1 seealso" id="refsect1-datetimeimmutable.createfromformat-seealso">
  <h3 class="title">参考</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="datetimeimmutable.construct.php" class="function" rel="rdfs-seeAlso">DateTimeImmutable::__construct()</a> - 新しい DateTimeImmutable オブジェクトを返す</span></li>
   <li><span class="function"><a href="datetimeimmutable.getlasterrors.php" class="function" rel="rdfs-seeAlso">DateTimeImmutable::getLastErrors()</a> - 警告およびエラーを返す</span></li>
   <li><span class="function"><a href="function.checkdate.php" class="function" rel="rdfs-seeAlso">checkdate()</a> - グレゴリオ暦の日付/時刻の妥当性を確認します</span></li>
   <li><span class="function"><a href="function.strptime.php" class="function" rel="rdfs-seeAlso">strptime()</a> - strftime が生成した日付/時刻をパースする</span></li>
  </ul>
 </div>


</div><?php manual_footer($setup); ?>