日付・時間

PHP DateTimeクラスの基本操作と活用法を解説

PHPでの日時処理は、Webアプリケーション開発に欠かせない機能です。

DateTimeクラスなどを活用することで、日付や時刻の計算、書式変更、タイムゾーンの制御が直感的に実現できます。

本記事では、基本的な使い方と実例を交えた操作方法を解説し、効率的な日時管理のポイントを紹介します。

DateTimeオブジェクトの生成

現在時刻の取得

DateTimeコンストラクタの利用

PHPでは、現在の日時を取得するためにシンプルにDateTimeコンストラクタを利用する方法があります。

以下のサンプルコードでは、現在の日時を取得し、formatメソッドで「年-月-日 時:分:秒」の形式に変換しています。

<?php
// 現在の日時オブジェクトを生成
$currentDate = new DateTime();
// 日付フォーマットで出力
echo $currentDate->format('Y-m-d H:i:s');
?>
2023-10-05 14:30:00

createFromFormatメソッドの利用

特定のフォーマットで書かれた日時文字列からDateTimeオブジェクトを生成する場合、createFromFormatメソッドが役立ちます。

以下の例では、'd/m/Y H:i'形式の日時文字列をパースして日時オブジェクトを作成しています。

<?php
// 定義されたフォーマットで日時文字列を解析
$dateString = '05/10/2023 14:30';
$currentDate = DateTime::createFromFormat('d/m/Y H:i', $dateString);
// パース結果を標準フォーマットで出力
echo $currentDate->format('Y-m-d H:i:s');
?>
2023-10-05 14:30:00

固定日時の指定

日時文字列からの生成

日時文字列を直接指定してDateTimeオブジェクトを生成することができます。

以下のサンプルコードは、特定の日時文字列を利用してオブジェクトを作成し、フォーマットして表示しています。

<?php
// 固定日時の文字列からDateTimeオブジェクトを生成
$fixedDate = new DateTime('2023-01-01 10:00:00');
// 日付を出力
echo $fixedDate->format('Y-m-d H:i:s');
?>
2023-01-01 10:00:00

UNIXタイムスタンプからの生成

UNIXタイムスタンプから日時オブジェクトを生成する方法は、日時文字列の前に「@」を付ける方法です。

以下のサンプルでは、UNIXタイムスタンプを基にDateTimeオブジェクトを作成しています。

<?php
// UNIXタイムスタンプからDateTimeオブジェクトを生成
$timestamp = 1672567200; // 例: 2023-01-01 10:00:00 のタイムスタンプ
$fixedDate = new DateTime("@$timestamp");
// タイムゾーンがデフォルトになっているため、フォーマットして出力
echo $fixedDate->format('Y-m-d H:i:s');
?>
2023-01-01 10:00:00

日付フォーマットの操作

formatメソッドの基本

定型フォーマットの利用例

DateTimeオブジェクトは、formatメソッドを使用して簡単に日付文字列へ変換できます。

以下のコード例では、標準的な日付フォーマット「年-月-日 時:分:秒」で出力しています。

<?php
// 現在の日時オブジェクトを生成
$currentDate = new DateTime();
// 定型フォーマットにて出力
echo $currentDate->format('Y-m-d H:i:s');
?>
2023-10-05 14:30:00

カスタムフォーマットの作成

カスタムフォーマットを利用することで、必要な情報だけを取り出して表示することが可能です。

以下のサンプルコードは、曜日や月名を含むカスタムフォーマットの例です。

<?php
// 日時オブジェクトを生成
$currentDate = new DateTime();
// カスタムフォーマット:曜日、月名、日付、年、時刻を出力
echo $currentDate->format('l, F j, Y, H:i:s');
?>
Thursday, October 5, 2023, 14:30:00

日付文字列のパース

createFromFormatメソッドの詳細

createFromFormatメソッドでは、任意のフォーマットに応じた日時文字列を解析できます。

以下の例では、分かりやすいフォーマット"Y/m/d H-i-s"で日時文字列を解析し、結果を確認しています。

<?php
// 日付文字列とそのフォーマットを指定して解析
$dateString = '2023/10/05 14-30-00';
$parsedDate = DateTime::createFromFormat('Y/m/d H-i-s', $dateString);
// 解析結果を定型フォーマットで出力
echo $parsedDate->format('Y-m-d H:i:s');
?>
2023-10-05 14:30:00

タイムゾーンを考慮したパース

タイムゾーンを明示的に指定しながら日時文字列をパースする場合、DateTimeZoneオブジェクトと組み合わせます。

以下のサンプルでは、東京のタイムゾーンを利用して、日時文字列を解析しています。

<?php
// タイムゾーンオブジェクトを生成
$tokyoTimeZone = new DateTimeZone('Asia/Tokyo');
// 日時文字列を解析する際にタイムゾーンを指定
$dateString = '2023-10-05 14:30:00';
$parsedDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString, $tokyoTimeZone);
// 結果を出力
echo $parsedDate->format('Y-m-d H:i:s T');
?>
2023-10-05 14:30:00 JST

日付と時刻の演算

時刻の加減算

DateIntervalオブジェクトの活用

日時演算には、DateIntervalオブジェクトを利用して複雑な期間を表現することができます。

以下のサンプルでは、1ヶ月と10日の間隔を表現し、現在の日時に加算して結果を表示しています。

<?php
// 現在の日時オブジェクトを生成
$currentDate = new DateTime();
// 1ヶ月と10日を表すDateIntervalオブジェクトを生成
$interval = new DateInterval('P1M10D');
// 日時に加算
$currentDate->add($interval);
// 結果を出力
echo $currentDate->format('Y-m-d');
?>
2023-11-15

modifyメソッドの利用例

modifyメソッドを利用すると、シンプルな文字列表現で日時を簡単に加減算できます。

次のサンプルでは、1日後の日時や2日前の日時を計算しています。

<?php
// 現在の日時オブジェクトを生成
$currentDate = new DateTime();
// 1日後に加算
$currentDate->modify('+1 day');
echo "1日後: " . $currentDate->format('Y-m-d H:i:s') . "\n";
// 2日前に減算
$currentDate->modify('-2 day');
echo "2日前: " . $currentDate->format('Y-m-d H:i:s');
?>
1日後: 2023-10-06 14:30:00
2日前: 2023-10-04 14:30:00

日付差分の算出

diffメソッドの使用例

diffメソッドを利用すると、2つの日時オブジェクト間の差分を算出することができます。

以下のコード例では、未来の日付と現在の日時の差を求め、日数差として表示しています。

<?php
// 現在の日時オブジェクトを生成
$currentDate = new DateTime();
// 任意の未来日付オブジェクトを生成
$futureDate = new DateTime('2023-12-25 00:00:00');
// 日付の差分を取得
$difference = $currentDate->diff($futureDate);
// 差分の日数を出力(絶対値を取得)
echo $difference->format('%a 日');
?>
81 日

タイムゾーンの操作

タイムゾーンオブジェクトの生成

DateTimeZoneクラスの基本

日時操作を正確に行うためには、タイムゾーンの指定が大切です。

DateTimeZoneクラスを利用すると、特定のタイムゾーンを設定することができます。

以下は、ニューヨークのタイムゾーンを生成する例です。

<?php
// ニューヨークのタイムゾーンオブジェクトを生成
$nyTimeZone = new DateTimeZone('America/New_York');
// タイムゾーン名を出力
echo $nyTimeZone->getName();
?>
America/New_York

タイムゾーンの変更

setTimezoneメソッドの利用例

既存のDateTimeオブジェクトのタイムゾーンをsetTimezoneメソッドで変更することができます。

以下のサンプルコードでは、日時オブジェクトのタイムゾーンを東京からロンドンに変更しています。

<?php
// 東京のタイムゾーンで日時オブジェクトを生成
$tokyoTimeZone = new DateTimeZone('Asia/Tokyo');
$date = new DateTime('2023-10-05 14:30:00', $tokyoTimeZone);
echo "変更前(東京): " . $date->format('Y-m-d H:i:s T') . "\n";
// ロンドンのタイムゾーンに変更
$londonTimeZone = new DateTimeZone('Europe/London');
$date->setTimezone($londonTimeZone);
echo "変更後(ロンドン): " . $date->format('Y-m-d H:i:s T');
?>
変更前(東京): 2023-10-05 14:30:00 JST
変更後(ロンドン): 2023-10-05 05:30:00 BST

タイムゾーン変更時のポイント

タイムゾーンを変更する際は、以下の点に注意する必要があります。

  • 日時そのものは変わらず、表示されるタイムゾーンに合わせた数値が変化すること。
  • 既存の日時オブジェクトに対してsetTimezoneを用いると、内部の時刻情報は協定世界時(UTC)に基づいた値に変換されるため、意図する表示結果となるよう管理すること。

以上の方法により、PHPのDateTimeクラスを用いた日付操作が柔軟に行えます。

まとめ

この記事では、PHPのDateTimeクラスを利用して現在日時の生成、固定日時の指定、日付フォーマットの操作、時刻演算およびタイムゾーンの変更など基本操作を実践例とともに解説しました。

全体を通して、各メソッドの使い方とその応用方法が整理できる内容となっています。

ぜひ新たな知識を活用し、日々のプログラミングに取り入れてみてください。

関連記事

Back to top button
目次へ