PHPのdatetimeで日付フォーマットを変換!思い通りの形式での出力

[PR]

PHP

PHPで日付や時刻を自由自在に表示させたい時、datetimeフォーマット変換は必須の知識です。format指定子の種類やDateTimeクラス/date関数の使い方、createFromFormatによるパースと変換テクニックなどを押さえることで、思い通りのフォーマットで日付を出力できるようになります。この記事では、PHP 日付 datetime フォーマット 変換に関して、初心者にも上級者にも役立つ具体例と最新のトレンドを解説します。

PHP 日付 datetime フォーマット 変換の基本とは

PHPで日付フォーマットを変換するとは、datetimeオブジェクトあるいはタイムスタンプなどのデータを、指定の書式で文字列として表示する処理を指します。例えば「2026年06月10日 15:30」のような形式に変えたり、ISO 8601形式やRFC形式にすることも頻繁です。date関数、DateTimeクラス、DateTimeInterface::formatメソッドといったAPIを使い、フォーマット指定子(Y, m, d, H, i, s など)を組み合わせて変換を行います。なお、タイムゾーン設定やマイクロ秒などに関する仕様も理解しておくことで、ずれや誤差を防ぐことが出来ます。

DateTime::format/date_formatの使い方

DateTimeオブジェクトのformatメソッドまたはdate_format関数を使うと、オブジェクトを指定のフォーマット文字列で文字列に変換できます。formatメソッドはDateTimeInterfaceから継承されたもので、DateTime/DateTimeImmutableの両方で利用可能です。例として、$dt = new DateTime(‘2026-06-10 15:30:45’);とした上で、$dt->format(‘Y-m-d H:i:s’)とすることで「2026-06-10 15:30:45」のように出力できます。

format書式には様々な文字があり、それぞれ意味があります。年を四桁で表示するY、月をゼロ埋めで表示するm、日をゼロ埋めのdなどが基本です。日付だけでなく曜日やタイムゾーン、ISO週番号などを含めたい場合にもこれらを組み合わせます。

date関数の利用とタイムスタンプの扱い

date関数はUnixタイムスタンプを指定して日付文字列を得るための手軽な方法です。timestampを省略すると現在時刻が対象となります。ただしdate関数はタイムゾーンを持たないタイムスタンプを元にするため、タイムゾーンを明示したい場合にはDateTimeクラスと併用するのが安全です。

例えばdate(‘Y/m/d H:i’, time())で「2026/06/10 15:30」のように出力できますが、ミリ秒/マイクロ秒を含みたい場合にはDateTimeオブジェクトを使い、formatでuやvのフォーマット指定子を利用します。

createFromFormatによるフォーマットからのパースと変換

元の文字列の日付形式が既知の場合、DateTime::createFromFormatを利用して文字列をDateTimeオブジェクトとして読み込むことができます。これによって誤解析を防ぎつつ、希望のフォーマットに変換することが可能です。たとえば「10-06-2026 15:30:45」という形式を「Y-m-d H:i:s」に変換する、といったケースです。

createFromFormatはフォーマット指定子が文字列と一致しないと失敗したり、警告が出るため、形式が確実に分かっているケースで使うことが望ましく、検証やエラーハンドリングも併せて行うと安全です。

DateTimeフォーマット指定子一覧と活用パターン

DateTimeのフォーマット指定子は非常に多く、多様な日付と時刻の要件に対応できます。ここでは主要な指定子とそれらを組み合わせた典型的な表示例を取り上げ、フォーマット変換の幅を広げる方法を紹介します。

主要なフォーマット指定子の意味

代表的な指定子は以下の通りです。四桁年のY、二桁日のd、曜日を表すlやD、月名をFやMなど。時刻部分では24時間表記のH、12時間表記のh、分のi、秒のsが使われます。タイムゾーンに関する指定子にはT(略号形式)、P(+02:00のような形式)、e(タイムゾーン名)などがあります。マイクロ秒(u)やミリ秒(v)もPHPのバージョンによって利用可能です。

例えばformat string「l, F jS Y g:i:s A T」とすると「Wednesday, June 10th 2026 3:30:45 PM UTC」などのような表現が可能です。

ISO/RFCなどの定義済み定数を利用する方法

DateTimeクラスには定義済みフォーマット定数が多数あります。例えばISO 8601形式、RFC3339、RSS、ATOMなどです。format定数を使うと複雑な書式を一から書かなくても規格に準じた形式で出力できます。

出力の信頼性を高めるため、これらの定数を使うとフォーマットミスの心配が減り、メンテナンス性も向上します。定数例としては、RFC2822 や ISO8601 などがあります。

マルチバイト文字/ロケール/非英語表記の注意点

DateTime::formatはフォーマット指定子自身が英語基準であるため、曜日や月名の英語表記となります。日本語などで出力したい場合はIntlDateFormatterなどを使う必要があります。その場合にはロケール設定と書式パターンを使って、月名や曜日を日本語で表示できるようになります。

また、タイムゾーンの設定や文字エンコーディングに気を配らないと文字化けや表示崩れが起きることがあります。マルチバイト対応文字列出力時にはUTF-8設定なども確認しておくことが望ましいです。

実践:文字列→別形式への変換処理の実例

実際に使われるシーンでは、外部データやユーザ入力として文字列で日付が入ってきて、それを別形式に変えて保存/表示することが多くあります。この章では典型的なケースとその変換処理をコード例とともに解説します。

例:ユーザ入力形式をmysqlのDATETIME形式に変換する

ユーザが「2026/6/10 15:30」などの形式で入力するケースを想定します。まずDateTime::createFromFormat(‘Y/n/j G:i’, $input)でパースし、次にformat(‘Y-m-d H:i:s’)でMysqlの標準形式に変換します。パース時に失敗する可能性があるため、falseチェックやDateTime::getLastErrors()での確認を含めるコードが望ましいです。

例えば:

$input = ‘2026/6/10 15:30’;
$dt = DateTime::createFromFormat(‘Y/n/j G:i’, $input);
if($dt === false){
  // 入力形式が期待と異なる場合の処理
}else{
  echo $dt->format(‘Y-m-d H:i:s’);
}

例:タイムスタンプから人間が読みやすい形式にする

データベースやAPIなどで得られるUnixタイムスタンプ(整数値)を人間可読な文字列へ変換するパターンです。time()関数やtimestampを受け取って、date(‘Y年m月d日 H時i分s秒’, $timestamp)のような形式にすることで日本語表記になります。

たとえば:
$timestamp = 1686393000;
echo date(‘Y年m月d日 H時i分s秒’, $timestamp);
とすれば、「2026年06月10日 15時30分00秒」などになります。ゼロ埋めや漢字表記を自由に組み合わせられます。

例:日時を曜日付き・タイムゾーン付きで表示する

以下は日時を曜日とタイムゾーン付きで表示したい場合の例です。DateTimeクラスのタイムゾーン設定とフォーマット指定子を組み合わせます。

コード例:
$dt = new DateTime(‘2026-06-10 15:30:45’, new DateTimeZone(‘Asia/Tokyo’));
echo $dt->format(‘Y年m月d日 l H:i:s T’);
これにより「2026年06月10日 火曜日 15:30:45 JST」のように出力できます。

PHPバージョン差異と最新のフォーマット機能

PHPのバージョンアップにより、新しいフォーマット指定子やタイムゾーンの扱いが追加されています。最新の機能を理解しておくことで、より強力かつ正確な変換処理が可能になります。

vおよびp指定子の追加

最近のPHPバージョンではミリ秒を表すvやタイムゾーンオフセットで特定用途に便利なpなどの指定子が追加されました。これにより、マイクロ秒(u)だけでは足りないケースでミリ秒が扱えるようになっており、ログ出力やAPI通信などで非常に役立ちます。

例えばformat(‘Y-m-d H:i:s.vP’)のようにすれば「2026-06-10 15:30:45.123+09:00」といった形式が得られます。

DateTimeImmutableとミュータブルオブジェクトの比較

DateTimeとDateTimeImmutableの主な違いは、オブジェクト操作の可変性です。DateTimeImmutableはメソッド呼び出しで元のオブジェクトを変更せず新しいインスタンスを返します。そのため意図しない副作用を避けたい処理やライブラリ開発の際に好まれます。フォーマット変換そのものの機能には変わりありませんが、設計方針に影響します。

プロジェクトで immutability を重要視するなら DateTimeImmutable を使い、format や createFromFormat を併用して安全に運用するのが推奨されます。

タイムゾーンの扱いの改善とデフォルト設定

PHPではタイムゾーンデータベースやデフォルトのタイムゾーン設定が改善されており、date_default_timezone_set で設定できるデフォルトタイムゾーンを環境設定と一致させることが重要です。サーバのロケールやタイムゾーン設定と PHP との間にズレがあると表示のずれや誤解が生じます。

また、フォーマット指定子 P や e を活用して、オフセットや地域名を含めることでより正確な表示が可能です。たとえば format(‘c’) 定数を使えば ISO 8601 の完全な日時表記が自動で得られます。

便利なユースケースと応用テクニック

実務ではフォーマット変換が複数の場面で必要とされます。ここでは応用テクニックや注意点をまとめて、より実践に即した内容にします。正確性やメンテナンス性を上げるためのヒントも含みます。

フォーム入力の検証とサニタイズ

ユーザが自由入力する日付形式には想定外の形式が含まれていることがあります。createFromFormat を使う前に preg_match や DateTime::getLastErrors を使って入力が正しいかどうかを検証すると安全です。また、月や日が不足していたりゼロ埋めがないケースなどを許容するパターンを設計することも現場ではよくあります。

ストレージと表示形式の分離設計

データベースやログには標準形式(例:YYYY-MM-DD HH:MM:SS)で保存し、表示時にローカライズされた形式に変換する設計が望ましいです。こうすることで保存されたデータの整合性が保たれ、後からフォーマットを変更したい場合にも柔軟に対応できます。

パフォーマンスとキャッシュの考慮

大量の日付変換を行う処理では、オブジェクト生成やフォーマット処理自体がコストになることがあります。可能であれば一度フォーマットした結果をキャッシュするか、複数回同じフォーマットを行う部分を関数や共通モジュールにまとめて使い回すと効率が上がります。

エラーハンドリングと例外処理

createFromFormat や DateTime のコンストラクタは不正な入力や形式に対して false を返したり例外を投げたりします。必ず戻り値チェックを行い、ユーザにフィードバックを返すかログに記録するようにすることが信頼性向上につながります。

実践コード集:さまざまなフォーマット変換例

ここでは複数のコード例で、異なる要求に沿ったフォーマット変換をまとめて紹介します。一からサンプルを見たい方に便利なコレクションです。

コード例1:ISO 8601 ⇔ 日本語表記

ISO 8601形式の「2026-06-10T15:30:45+09:00」から、日本語表記「2026年06月10日 15時30分45秒」に変換する例です。createFromFormat でパースし、formatで日本語書式に出力します。タイムゾーンが含まれている形式には DateTimeZone を指定して読み込むと安全です。

コード例2:ミリ秒付きログタイムスタンプ出力

ログ出力やAPIレスポンスで応答時間を含めたい場合、フォーマットにミリ秒(v)を含めた形で出力します。例えば format(‘Y-m-d H:i:s.v’) として、タイムスタンプ付き+ミリ秒の精度を持たせる形式にします。これにより秒未満の時間差が明確になります。

コード例3:異なる入力フォーマットの自動判別と共通出力フォーマットへの統一

入力形式が複数あり得る場合、複数のフォーマットによる createFromFormat を試し、成功したものを共通の形式(例:Y-m-d H:i:s)に変換するパターンです。失敗が続く場合にはデフォルト日付を使うかエラーを返す設計が標準的です。

まとめ

PHPで「日付 datetime フォーマット 変換」を思い通りに行うためには、DateTimeクラスとformat指定子の理解、createFromFormatなどのパース機能の活用、タイムゾーンやマイクロ秒/ミリ秒の新しい指定子の把握が鍵となります。保存時の標準形式と表示時のローカル表記を分ける設計や、入力検証とエラーハンドリングを怠らないことも重要です。これらを押さえれば、様々な場面で正確かつ柔軟な日付フォーマット変換が可能になります。

関連記事

特集記事

コメント

この記事へのトラックバックはありません。

TOP
CLOSE