PHP

PHPのDateTimeクラスをマスターする:日付と時刻の操作方法


PHPで日付や時刻を効率的に扱うためには、DateTime クラスを使用することが推奨されます。このクラスを使えば、日付の生成、フォーマット変更、日時計算などが容易になります。
以下に、DateTimeクラスの実用的な例をいくつか紹介します。

DateTimeクラスの基本

DateTime クラスは、PHPの日付と時刻をオブジェクト指向スタイルで扱うためのものです。以下のようにして日付のオブジェクトを生成し、様々な操作が可能になります。

$datetime = new DateTime(); // 現在の日時でDateTimeオブジェクトを作成
echo $datetime->format('Y-m-d H:i:s'); // 日時を指定のフォーマットで出力

特定の日時を設定

特定の日時でDateTimeオブジェクトを初期化することもできます。コンストラクタに日時を文字列で渡します。

$datetime = new DateTime('2024-12-31 23:59:59');
echo $datetime->format('Y-m-d H:i:s');

日時のフォーマットを変更

特定の日時の書式を変更します。

$date = new DateTime();
echo $date->format('l, F j, Y');  // 出力例: Monday, June 3, 2024

日時の加算と減算

DateTime オブジェクトには modify() メソッドを使用して日時を加算または減算することができます。また、DateInterval クラスを利用する方法もあります。

$datetime->modify('+1 day');
echo $datetime->format('Y-m-d H:i:s'); // 1日後の日時を出力

$interval = new DateInterval('P1M'); // 1ヶ月を表すインターバル
$datetime->add($interval); // 1ヶ月加算
echo $datetime->format('Y-m-d H:i:s');

時差の扱い

DateTime クラスはタイムゾーンも扱うことができます。タイムゾーンを指定してオブジェクトを生成したり、後から変更したりすることが可能です。

$datetime = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
echo $datetime->format('Y-m-d H:i:s T');

$datetime->setTimezone(new DateTimeZone('Europe/London')); // タイムゾーンをロンドンに変更
echo $datetime->format('Y-m-d H:i:s T');

日時の文字列変換

文字列からDateTimeオブジェクトを作成します。

$dateString = '2023-01-01 10:00:00';
$date = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
echo $date->format('Y-m-d H:i:s');  // 出力: 2023-01-01 10:00:00

DateTimeクラスの主要なメソッド

コンストラクタ

__construct ([ string $datetime = “now” [, DateTimeZone $timezone = NULL ]] )
DateTimeオブジェクトを作成します。引数なしで現在日時、文字列で特定の日時を指定できます。

$date = new DateTime();  // 現在日時
$date = new DateTime('2023-01-01 12:00:00');  // 特定の日時

日時のフォーマット

format ( string $format ) : string
日時を指定したフォーマットで文字列に変換します。

$date = new DateTime();
echo $date->format('Y-m-d H:i:s');  // 出力例: 2024-06-03 12:34:56

日時の計算

add ( DateInterval $interval ) : DateTime
指定した期間を現在の日時に追加します。

$date = new DateTime();
$date->add(new DateInterval('P1D'));  // 1日を追加
echo $date->format('Y-m-d');  // 出力例: 2024-06-04

sub ( DateInterval $interval ) : DateTime
指定した期間を現在の日時から減算します。

$date = new DateTime();
$date->sub(new DateInterval('P1W'));  // 1週間を減算
echo $date->format('Y-m-d');  // 出力例: 2024-05-27

日時の比較

diff ( DateTimeInterface $datetime2, bool $absolute = false ) : DateInterval
2つのDateTimeオブジェクトの差を計算します。absoluteがtrueの場合、絶対値を返します。

$date1 = new DateTime('2023-01-01');
$date2 = new DateTime('2024-01-01');
$interval = $date1->diff($date2);
echo $interval->format('%y years, %m months, %d days');  // 出力: 1 years, 0 months, 0 days

タイムゾーンの操作

setTimezone ( DateTimeZone $timezone ) : DateTime
日時のタイムゾーンを設定します。

$date = new DateTime('now', new DateTimeZone('UTC'));
$date->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo $date->format('Y-m-d H:i:s');  // 出力例: 2024-06-03 21:34:56 (東京時間)

getTimezone ( void ) : DateTimeZone
現在のタイムゾーンを取得します。

$date = new DateTime();
$timezone = $date->getTimezone();
echo $timezone->getName();  // 出力例: UTC

文字列からDateTimeオブジェクトを作成

createFromFormat ( string $format , string $time [, DateTimeZone $timezone = NULL ] ) : DateTime
指定したフォーマットの文字列からDateTimeオブジェクトを作成します。

$dateString = '2023-01-01 12:00:00';
$date = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
echo $date->format('Y-m-d H:i:s');  // 出力: 2023-01-01 12:00:00

日時のミューテーション

modify ( string $modify ) : DateTime
指定した文字列を用いて日時を変更します。

$date = new DateTime('2023-01-01');
$date->modify('+1 month');
echo $date->format('Y-m-d');  // 出力: 2023-02-01

静的メソッド

DateTime::setState ( array $array ) : DateTime
シリアライズされた状態から新しいDateTimeオブジェクトを作成します。

$date = new DateTime('2023-01-01');
$serialized = serialize($date);
$newDate = DateTime::setState(unserialize($serialized));
echo $newDate->format('Y-m-d');  // 出力: 2023-01-01

DateTime::createFromImmutable ( DateTimeImmutable $object ) : DateTime
DateTimeImmutableオブジェクトから新しいDateTimeオブジェクトを作成します。

$immutable = new DateTimeImmutable('2023-01-01');
$mutable = DateTime::createFromImmutable($immutable);
echo $mutable->format('Y-m-d');  // 出力: 2023-01-01

まとめ

DateTime クラスはPHPにおいて日付と時刻を扱う強力なツールです。オブジェクト指向のアプローチを取ることで、日付と時刻に関連する様々な操作を簡単かつ直感的に実行できます。

アバター画像

Groworks Inc.

ものづくりのまち燕三条にある三条ものづくり学校を拠点とし、新潟市、長岡市、燕市、柏崎市を中心に活動しているウェブサイト・ホームページ制作会社です。