日付・時間

PHPのdate関数を利用した日付フォーマットについて解説

PHPを使って日付を扱う際、フォーマットの指定は柔軟な実装を可能にします。

例えば、date()関数を利用すると、Unixエポックから出力する日付を任意の形式に変換できます。

t をタイムスタンプとした場合、date('Y-m-d H:i:s', t) のように記述し、年、月、日、時間などを調整することが可能です。

基本的な使い方をシンプルな実例を通して紹介します。

PHPのdate()関数を用いた基本の日付フォーマット

date()関数の基本的な使い方

日付と時刻の取得方法

date()関数を利用すると、指定したフォーマットに沿った日付や時刻の文字列を取得することができます。

例えば、現在の日付と時刻を「YYYY-MM-DD HH:ii:ss」形式で出力する場合、次のように記述します。

<?php
// 現在の日付と時刻を "Y-m-d H:i:s" 形式で取得
$currentDateTime = date("Y-m-d H:i:s");
echo $currentDateTime;  // 出力例: 2023-10-05 14:30:00
?>
2023-10-05 14:30:00

Unixタイムスタンプとの連携

date()関数は、第2引数にUnixタイムスタンプを指定することで、任意の時刻をフォーマットして出力することができます。

Unixタイムスタンプは1970年1月1日0時0分0秒(UTC)からの経過秒数で表されます。

<?php
// 指定したUnixタイムスタンプから日付を生成
$timestamp = 1609459200; // 2021-01-01 00:00:00 UTC
$dateFromTimestamp = date("Y-m-d H:i:s", $timestamp);
echo $dateFromTimestamp;  // 出力例: 2021-01-01 09:00:00 (東京の場合)
?>
2021-01-01 09:00:00

フォーマット文字列の種類と役割

主なフォーマット文字の一覧

date()関数で使用できるフォーマット文字には、以下のようなものがあります。

次の表は主要なフォーマット文字の一覧とその説明です。

フォーマット文字説明
Y西暦4桁
m月(2桁)
d日(2桁)
H時(24時間制、2桁)
i分(2桁)
s秒(2桁)

出力例による確認

各フォーマット文字がどのように出力されるか、サンプルコードで確認することができます。

<?php
// 各フォーマット文字の出力例を確認するサンプル
$formatList = [
    "Y" => date("Y"),   // 西暦4桁
    "m" => date("m"),   // 月(2桁)
    "d" => date("d"),   // 日(2桁)
    "H" => date("H"),   // 時(24時間制、2桁)
    "i" => date("i"),   // 分(2桁)
    "s" => date("s")    // 秒(2桁)
];
foreach ($formatList as $format => $value) {
    echo $format . ": " . $value . "\n";
}
?>
Y: 2023
m: 10
d: 05
H: 14
i: 30
s: 00

DateTimeクラスを利用した柔軟な日付操作

DateTimeオブジェクトの生成方法

現在日時の取得

DateTimeクラスを利用すると、より柔軟な日付操作が可能になります。

以下のサンプルコードでは、new DateTime()を呼び出すことで現在日時のDateTimeオブジェクトを生成し、フォーマットを指定して出力しています。

<?php
// DateTimeオブジェクトを生成して現在日時を取得
$currentDateTime = new DateTime();
echo $currentDateTime->format("Y-m-d H:i:s"); // 出力例: 2023-10-05 14:30:00
?>
2023-10-05 14:30:00

任意日時の指定方法

任意の日付や時刻を指定する場合も、DateTimeクラスを活用できます。

引数に日付文字列を指定することで、その日時を表すオブジェクトを生成します。

<?php
// 任意の日付を指定してDateTimeオブジェクトを生成
$customDate = new DateTime("2021-01-01 12:00:00");
echo $customDate->format("Y-m-d H:i:s"); // 出力例: 2021-01-01 12:00:00
?>
2021-01-01 12:00:00

タイムゾーン設定の管理

タイムゾーンの指定方法

DateTimeZoneクラスを利用して、特定のタイムゾーンで日時を操作することができます。

以下のコードは、タイムゾーンを「Asia/Tokyo」に指定してDateTimeオブジェクトを生成する例です。

<?php
// タイムゾーンを "Asia/Tokyo" に設定してDateTimeオブジェクトを生成
$timezone = new DateTimeZone("Asia/Tokyo");
$dateTimeTokyo = new DateTime("now", $timezone);
echo $dateTimeTokyo->format("Y-m-d H:i:s"); // 出力例: 2023-10-05 14:30:00
?>
2023-10-05 14:30:00

デフォルトタイムゾーンの設定手順

グローバルにタイムゾーンを設定する場合は、date_default_timezone_set()関数を使用します。

これにより、後続のdate()関数やDateTimeクラスでの日時が指定したタイムゾーンで処理されます。

<?php
// デフォルトタイムゾーンを "Asia/Tokyo" に設定
date_default_timezone_set("Asia/Tokyo");
echo date("Y-m-d H:i:s"); // 出力例: 2023-10-05 14:30:00
?>
2023-10-05 14:30:00

実践例でみる日付フォーマット応用

入力からフォーマット変換までの流れ

ユーザー入力の取得と前処理

ユーザーから入力された日付文字列には不要な空白が含まれている場合があります。

trim()関数を用いて、入力値の前後の空白を削除することで正確な変換が可能になります。

<?php
// ユーザー入力の日付文字列(サンプルとして直接値を代入)
$userInput = " 2021-07-15 08:30:00 ";
$trimmedInput = trim($userInput);  // 前後の空白を削除
echo $trimmedInput;  // 出力例: 2021-07-15 08:30:00
?>
2021-07-15 08:30:00

フォーマット変換の実装例

ユーザーから受け取った日付文字列をDateTimeオブジェクトに変換し、任意のフォーマットで再出力する例です。

ここでは、「d/m/Y H:i」形式にフォーマットを変更しています。

<?php
// ユーザー入力の日付文字列をDateTimeオブジェクトに変換してからフォーマット変換
$userInput = "2021-07-15 08:30:00";
$dateObject = new DateTime($userInput);
$formattedDate = $dateObject->format("d/m/Y H:i");
echo $formattedDate; // 出力例: 15/07/2021 08:30
?>
15/07/2021 08:30

ローカル日付とUTCの変換事例

日付計算による調整方法

UTCとして扱う日付を基に、特定のタイムゾーンに変換する場合、setTimezone()メソッドを利用します。

次のコードでは、UTCで指定した日時を「Asia/Tokyo」タイムゾーンに変換して表示しています。

<?php
// UTCとして扱う日付を作成し、Asia/Tokyoに変換して表示
$dateUtc = new DateTime("2021-07-15 08:30:00", new DateTimeZone("UTC"));
$dateUtc->setTimezone(new DateTimeZone("Asia/Tokyo"));
echo $dateUtc->format("Y-m-d H:i:s"); // 出力例: 2021-07-15 17:30:00
?>
2021-07-15 17:30:00

複数シナリオへの対応

異なるタイムゾーンでの日時表示を実現するため、同じ基準の日時から各タイムゾーンごとに変換する例です。

各タイムゾーンに対応する日時を順次出力することで、複数のシナリオに対応できます。

<?php
// UTCを基準とした日付を各タイムゾーンに変換して表示するサンプル
$dateBase = new DateTime("2021-07-15 08:30:00", new DateTimeZone("UTC"));
$timezones = ["Asia/Tokyo", "America/New_York", "Europe/London"];
foreach ($timezones as $zone) {
    // DateTimeオブジェクトを改めて生成して各タイムゾーンで表示
    $dateZone = new DateTime("2021-07-15 08:30:00", new DateTimeZone("UTC"));
    $dateZone->setTimezone(new DateTimeZone($zone));
    echo "Timezone " . $zone . ": " . $dateZone->format("Y-m-d H:i:s") . "\n";
}
?>
Timezone Asia/Tokyo: 2021-07-15 17:30:00
Timezone America/New_York: 2021-07-15 04:30:00
Timezone Europe/London: 2021-07-15 09:30:00

エラー対応とトラブルシューティング

よくあるエラーの原因分析

フォーマット指定ミス

フォーマット文字の指定ミスにより、意図しない出力が得られる場合があります。

たとえば、12時間制のhを利用するときにAM/PMの指定がないと混乱を招くことがあります。

<?php
// フォーマット指定に誤りがある例(12時間制を使用しているが、AM/PMが表示されない)
$dateExample = date("Y-m-d h:i:s");
echo $dateExample;  // 出力例: 2023-10-05 02:30:00 ※AM/PM情報に注意
?>
2023-10-05 02:30:00

タイムゾーン設定の誤り

存在しないタイムゾーンを指定するとエラーが発生します。

以下のコードは、無効なタイムゾーンを使用した場合の例です。

<?php
// 無効なタイムゾーン "Invalid/Zone" を指定した場合の例
$invalidZone = "Invalid/Zone";
try {
    $dateTime = new DateTime("now", new DateTimeZone($invalidZone));
    echo $dateTime->format("Y-m-d H:i:s");
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();  // 出力例: Error: DateTimeZone::__construct(): Unknown or bad timezone (Invalid/Zone)
}
?>
Error: DateTimeZone::__construct(): Unknown or bad timezone (Invalid/Zone)

発生エラーへの対処法

デバッグ手法のポイント

エラー発生時は、try-catchブロックなどを活用して例外処理を行い、エラーメッセージから原因を特定することが大切です。

<?php
// try-catchブロックを用いたエラーハンドリングの例
try {
    // 不正な日時文字列を渡して例外を発生させる
    $dateTime = new DateTime("invalid date string");
    echo $dateTime->format("Y-m-d H:i:s");
} catch (Exception $e) {
    echo "Error handled: " . $e->getMessage();  // 出力例: Error handled: DateTime::__construct(): Failed to parse time string (invalid date string) at position 0
}
?>
Error handled: DateTime::__construct(): Failed to parse time string (invalid date string) at position 0

コード改善のヒント

エラー対応の際は、次のポイントに注意すると良いでしょう。

  • ユーザー入力の検証を厳密に行う
  • 明確なエラーメッセージを出力する
  • 複数箇所で同様の処理が必要な場合は関数化を検討する
<?php
// 改善のためのヒントをコメントに記述
// 1. 入力値検証を確実に行う
// 2. エラー発生時は詳細なメッセージをログに記録する
// 3. 再利用可能な処理部分はカスタム関数にまとめる
?>

カスタマイズと応用テクニック

ユーザー定義フォーマットの実装方法

カスタム関数の活用例

ユーザー定義の関数を作成することで、日付フォーマット変換の処理を再利用しやすくなります。

以下の例は、入力の日付文字列を任意のフォーマットに変換するカスタム関数のサンプルです。

<?php
// ユーザー定義関数 customDateFormat を作成し、日付のフォーマット変換を実施する例
function customDateFormat($dateString, $format) {
    $dateObject = new DateTime($dateString);
    return $dateObject->format($format);
}
// 関数を利用してフォーマット変換を実施
echo customDateFormat("2021-07-15 08:30:00", "d-m-Y H:i"); // 出力例: 15-07-2021 08:30
?>
15-07-2021 08:30

再利用性向上の工夫

同じ処理を複数箇所で利用する場合、関数化することで再利用性が向上します。

下記のサンプルは、タイムゾーンやフォーマットを引数として指定できる関数の例です。

<?php
// getFormattedDate 関数は再利用性を高めるために作成した例
function getFormattedDate($dateString, $timezone = "UTC", $format = "Y-m-d H:i:s") {
    $dateObject = new DateTime($dateString, new DateTimeZone($timezone));
    return $dateObject->format($format);
}
// 異なるタイムゾーンでの利用例
echo getFormattedDate("2021-07-15 08:30:00", "Asia/Tokyo");  // 出力例: 2021-07-15 17:30:00
?>
2021-07-15 17:30:00

高度な日付操作の応用事例

日付計算の複雑な処理

DateTimeオブジェクトのmodify()メソッドを活用することで、日付に対する加減算などの複雑な処理が可能です。

以下のコード例では、指定した日に10日を加算して新たな日付を求めています。

<?php
// DateTimeオブジェクトに対して日付の加算を行う例
$dateObject = new DateTime("2021-07-15 08:30:00");
$dateObject->modify("+10 days");
echo $dateObject->format("Y-m-d H:i:s");  // 出力例: 2021-07-25 08:30:00
?>
2021-07-25 08:30:00

マルチロケール対応の工夫

IntlDateFormatterを利用すると、ロケールに応じた日付表示形式に変換することができます。

特に、複数のロケールに対応させたい場合に有効です。

下記のサンプルは、ja_JPロケールで指定したパターンにより日付をローカライズして出力する例です。

<?php
// IntlDateFormatterを利用してローカライズされた日付形式に変換する例
$locale = "ja_JP";
$timeZone = "Asia/Tokyo";
$dateObject = new DateTime("2021-07-15 08:30:00", new DateTimeZone($timeZone));
// IntlDateFormatterでフォーマットを指定
$formatter = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::SHORT);
$formatter->setPattern("yyyy年MM月dd日 HH:mm:ss");
echo $formatter->format($dateObject);  // 出力例: 2021年07月15日 08:30:00
?>
2021年07月15日 08:30:00

まとめ

この記事では、PHPのdate関数とDateTimeクラスを用いた日付フォーマットやタイムゾーン設定、エラー対応、応用テクニックを幅広く解説しました。

総括すると、基本から実践例まで通して日付操作の知識が得られる内容でした。

ぜひ実際にコードを試し、今回の知識をプロジェクトに生かしてください。

関連記事

Back to top button
目次へ