PHPでは、 Strptime()関数を使用して、日付と時刻の文字列を配列形式に解析し、特定の形式で解析結果を返します。この機能は通常、日付と時刻関連のタスクを扱う場合に非常に役立ちます。ただし、開発中、 Strptime()が解析できない場合があり、結果としてfalseを返し、デバッグが困難になります。
この記事では、Strptime()解析障害の一般的な誤差の原因を詳細に調べ、対応するソリューションを提供します。
Strptime()の最初のパラメーターは日付の文字列であり、2番目のパラメーターはフォーマット文字列です。 DateTime文字列がフォーマットされた文字列と一致しない場合、 strptime()は正しく解析されず、 falseを返します。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"2025-06-17 15:30"</span></span><span>;
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%Y/%m/%d"</span></span><span>; </span><span><span class="hljs-comment">// 誤った形式</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 出力false</span></span><span>
</span></span>
DateTime文字列がフォーマットされた文字列と正確に一致することを確認してください。たとえば、DateTime文字列が2025-06-17 15:30の場合、フォーマットされた文字列は「%y-%m-%d%h:%m」でなければなりません。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"2025-06-17 15:30"</span></span><span>;
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%Y-%m-%d %H:%M"</span></span><span>; </span><span><span class="hljs-comment">// 正しい形式</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 正しい分析,返品結果</span></span><span>
</span></span>
Strptime()は、 %y 、 %m 、 %d 、 %h 、 %mなどの標準形式のフラグをサポートしますが、サポートされていないフラグを使用しようとする開発者に遭遇したり、不適切な状況を使用したりすることもあります。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"2025-06-17 15:30"</span></span><span>;
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%G-%m-%d %H:%M"</span></span><span>; </span><span><span class="hljs-comment">// サポートされていないフォーマットフラグを誤って使用しました</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 出力false</span></span><span>
</span></span>
Strptime()を使用する場合は、PHPでサポートされている標準のフォーマットフラグを使用してください。より複雑な日付形式の解析が必要な場合は、 strptime()の代わりにdateTime :: createFromFormat()の使用を検討してください。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"2025-06-17 15:30"</span></span><span>;
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%Y-%m-%d %H:%M"</span></span><span>; </span><span><span class="hljs-comment">// 正しい形式</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 正しい分析,返品結果</span></span><span>
</span></span>
時には、DateTime String自体に不適切な文字が含まれ、 Strptime()が解析できなくなる場合があります。たとえば、文字列には余分なスペースまたは無効な日付パーツが含まれています。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"2025-06-17 15:30"</span></span><span>; </span><span><span class="hljs-comment">// 日付文字列には余分なスペースがあります</span></span><span>
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%Y-%m-%d %H:%M"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 出力false</span></span><span>
</span></span>
Strptime()を渡す前に、余分なスペースや無効な文字をクリーンアップするか、使用するとデータを一貫させてください。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"2025-06-17 15:30"</span></span><span>;
</span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>); </span><span><span class="hljs-comment">// 余分なスペースをクリアします</span></span><span>
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%Y-%m-%d %H:%M"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 正しい分析,返品結果</span></span><span>
</span></span>
Strptime()関数の解析挙動は、システム時間ロケールの影響を受ける可能性があります。システムのロケール設定が日付文字列の言語/領域と一致しない場合、解析が失敗する可能性があります。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"17 Juin 2025 15:30"</span></span><span>; </span><span><span class="hljs-comment">// フランス語の日付</span></span><span>
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%d %b %Y %H:%M"</span></span><span>; </span><span><span class="hljs-comment">// フランスの月</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 出力false</span></span><span>
</span></span>
Strptime()を使用する場合、特に日付文字列に月または週が含まれている場合、システムのロケールが適切に設定またはチェックされることを確認してください。現在のロケールは、setlocale()関数を介して調整できます。
<span><span><span class="hljs-title function_ invoke__">setlocale</span></span><span>(LC_TIME, </span><span><span class="hljs-string">'fr_FR.UTF-8'</span></span><span>); </span><span><span class="hljs-comment">// フランス語に設定</span></span><span>
</span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"17 Juin 2025 15:30"</span></span><span>;
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"%d %b %Y %H:%M"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strptime</span></span><span>(</span><span><span class="hljs-variable">$date</span></span><span>, </span><span><span class="hljs-variable">$format</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>); </span><span><span class="hljs-comment">// 正しい分析,返品結果</span></span><span>
</span></span>
Strptime()には有用性がありますが、その機能と柔軟性はPHPのDateTimeクラスに比べてわずかに不十分です。 Strptime()解像度の障害の問題に複数回遭遇した場合、 DateTime :: CreateFromFormat()メソッドの使用を検討できます。
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-string">"2025-06-17 15:30"</span></span><span>;
</span><span><span class="hljs-variable">$format</span></span><span> = </span><span><span class="hljs-string">"Y-m-d H:i"</span></span><span>; </span><span><span class="hljs-comment">// 使用DateTime分析</span></span><span>
</span><span><span class="hljs-variable">$datetime</span></span><span> = </span><span><span class="hljs-title class_">DateTime</span></span><span>::</span><span><span class="hljs-title function_ invoke__">createFromFormat</span></span><span>(</span><span><span class="hljs-variable">$format</span></span><span>, </span><span><span class="hljs-variable">$date</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$datetime</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$datetime</span></span><span>); </span><span><span class="hljs-comment">// 出力日期对象</span></span><span>
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"分析失败"</span></span><span>;
}
</span></span>
DateTime :: createFromFormat()メソッドは、より広い形式をサポートするだけでなく、より多くのエラー処理関数を提供し、開発者がデバッグするのがより便利になります。
Strptime()を使用する場合、解析障害の一般的な理由には、フォーマットの不一致、サポートされていないフォーマットフラグの使用、入力データの例外の使用、時間領域設定の問題などが含まれます。より複雑な日付の解析要件のために、 DateTimeクラスはより近代的で強力な代替品です。