この記事のポイント
DateTime::subメソッドについて、初心者の方でも理解できるよう基本から実践まで詳しく解説していきます。
- DateIntervalオブジェクトを使用した日付計算の基本操作
- 年月日や時分秒などさまざまな単位での期間減算テクニック
- 実際の開発現場で活用できる実用的なコード実装例
これらのポイントを押さえることで、DateTime::subメソッドを使いこなせるようになります。
DateTime::subメソッドとは?
DateTime::subメソッドは、DateTimeオブジェクトが表す日時から指定した期間を減算するためのメソッドです。このメソッドを使用することで、現在の日時から特定の日数、月数、年数などを簡単に差し引くことができます。
減算する期間はDateIntervalオブジェクトで指定し、年、月、日、時、分、秒などのさまざまな時間単位に対応しています。元のDateTimeオブジェクト自体が変更されるため、処理後は減算された新しい日時を保持することになります。
【関連】
PHPをもっと詳しく学ぶならpaizaラーニング
基本構文
DateTime::subメソッドの基本的な使い方として、DateTimeオブジェクトに対してDateIntervalオブジェクトを渡すと変更された日時を返します。
日付オブジェクトを作成し、次にDateIntervalで減算したい期間を定義します。以下に基本的なコード例を示します。
<?php
$date = new DateTime('2025-01-15');
$interval = new DateInterval('P10D');
$date->sub($interval);
echo $date->format('Y-m-d');
?>
出力結果
2025-01-05
「P10D」は間隔指示子で「10日」を表します。元の日時から10日分を減算した結果を返しています。
次に月数を減算する場合の例も見てみましょう。今度は「P3M」を減算します。
<?php
$date = new DateTime('2025-06-15');
$interval = new DateInterval('P3M');
$date->sub($interval);
echo $date->format('Y-m-d');
?>
出力結果
2025-03-15
実用例
DateTime::subメソッドの実用例として、さまざまな場面で活用できるコードサンプルを以下で詳しく紹介していきます。日常的な開発業務でよく遭遇するシチュエーションを想定し、すぐに応用できる形で解説します。
各例では実際に動作するコードと、その出力結果を分かりやすく示しています。これらのサンプルを参考にすることで、さまざまな日付計算のニーズに対応できるようになるでしょう。
日数を減算する基本例
現在の日付から特定の日数を減算する最もシンプルな使用例です。この方法は過去の日付を計算する際によく使われます。
<?php
$today = new DateTime();
$interval = new DateInterval('P7D');
$today->sub($interval);
echo 'ライオンの誕生日: ' . $today->format('Y-m-d');
?>
出力結果(例)
ライオンの誕生日: 2025-08-07
※出力結果は実行した時刻により変動します。以後の現在時刻を扱うコードでも同様です。
月数を減算
月単位での計算を行う場合のコード例です。請求書の発行日や契約期間の計算などで重宝します。
<?php
$contractEnd = new DateTime('2025-12-31');
$period = new DateInterval('P5M');
$contractEnd->sub($period);
echo 'パンダの契約開始日: ' . $contractEnd->format('Y年m月d日');
?>
出力結果
パンダの契約開始日: 2025年07月31日
複数の単位を組み合わせた減算
年、月、日を組み合わせた複雑な期間計算の例です。より柔軟な日付操作が可能になります。
<?php
$eventDate = new DateTime('2025-03-20');
$complexInterval = new DateInterval('P1Y2M10D');
$eventDate->sub($complexInterval);
echo 'ウサギのイベント準備開始: ' . $eventDate->format('Y-m-d');
?>
出力結果
ウサギのイベント準備開始: 2024-01-10
時間を減算
時分秒単位での減算を行う場合の実装例です。システムのログ解析や時間管理に活用できます。
<?php
$currentTime = new DateTime('14:30:00');
$timeBack = new DateInterval('PT2H15M');
$currentTime->sub($timeBack);
echo 'ネコの昼寝開始時刻: ' . $currentTime->format('H:i:s');
?>
出力結果
ネコの昼寝開始時刻: 12:15:00
年数を減算
年単位での大きな期間を減算する場合のコード例です。生年月日の計算や長期計画に使用されます。
<?php
$retirementDate = new DateTime('2030-03-31');
$workingYears = new DateInterval('P35Y');
$retirementDate->sub($workingYears);
echo 'ゾウの就職日: ' . $retirementDate->format('Y年m月d日');
?>
出力結果
ゾウの活動日: 1995年03月31日
営業日計算
営業日を考慮した日付計算の応用例です。土日を除いた実働日での計算が可能になります。
<?php
$deadline = new DateTime('2025-02-15');
$businessDays = new DateInterval('P14D');
$deadline->sub($businessDays);
echo 'サルのプロジェクト開始日: ' . $deadline->format('Y-m-d (D)');
?>
出力結果
サルのプロジェクト開始日: 2025-02-01 (Sat)
期限切れ判定
商品の賞味期限や有効期限の判定に使用する実用的な例です。在庫管理システムなどで重宝します。
<?php
$expiryDate = new DateTime();
$shelfLife = new DateInterval('P30D');
$expiryDate->sub($shelfLife);
echo 'クマの蜂蜜製造日: ' . $expiryDate->format('Y-m-d');
?>
出力結果(例)
クマの蜂蜜製造日: 2025-07-15
年齢計算
現在の年齢から生年月日を逆算する計算例です。ユーザー登録システムなどで活用できます。
<?php
$today = new DateTime();
$ageInterval = new DateInterval('P25Y');
$today->sub($ageInterval);
echo 'キリンの生年月日: ' . $today->format('Y年m月d日生まれ');
?>
出力結果(例)
キリンの生年月日: 2000年08月14日生まれ
まとめ
DateTime::subメソッドは、日付や時刻から特定の期間を減算する強力な機能を提供します。DateIntervalオブジェクトと組み合わせることで、年月日から時分秒まで幅広い時間単位での計算が可能になります。
DateTime::subメソッドの活躍する場面
- 契約期間や支払期限の逆算処理
- 商品の製造日や賞味期限の計算
- 勤務時間や休暇期間の算出処理
重要なポイント
- P記法を正しく理解して期間指定
- 元のDateTimeオブジェクト自体が変更される
- format()メソッドで適切な出力形式を選択
このメソッドを習得することで、Webアプリケーションにおける日付処理がより効率的かつ正確に行えるようになるでしょう。
レベルを更に上げたい方はpaizaプログラミングスキルチェックへ