【PHP8.x】date_sub関数の使い方

作成日: 更新日:

date_sub関数は、指定されたDateTimeオブジェクトから、指定されたDateIntervalオブジェクトが表す期間を減算する関数です。この関数は、特定の日付や時刻から一定の期間を遡りたい場合に利用されます。

第一引数には、操作の対象となるDateTimeオブジェクトを渡します。このオブジェクトが持つ日付と時刻の情報に対して減算処理が行われます。第二引数には、減算したい期間を定義したDateIntervalオブジェクトを指定します。例えば、「10日」や「1年2ヶ月」といった具体的な期間を表現できます。

date_sub関数は、渡されたDateTimeオブジェクトの値を直接変更し、期間が減算されたDateTimeオブジェクトを返します。これにより、元のオブジェクトが更新され、減算後の日付や時刻を持つ新しい状態のオブジェクトとして利用できます。もし減算処理が何らかの理由で失敗した場合には、この関数はブール値のfalseを返します。

この機能を使用することで、例えば「現在の日付から3ヶ月前の日付を算出する」や、「特定のイベントの開始時刻から1時間前の時刻を求める」といった日付・時刻の計算を正確に行うことが可能です。日付や時刻の操作において、期間を引くための基盤となる重要な関数です。

基本的な使い方

構文(syntax)

<?php

$dateTime = new DateTime('2024-07-26');
$interval = new DateInterval('P10D'); // 10日間の期間
date_sub($dateTime, $interval);

?>

引数(parameters)

DateTime $object, DateInterval $interval

  • object: DateTime: 減算対象となるDateTimeオブジェクト
  • interval: DateInterval: 減算する期間を指定するDateIntervalオブジェクト

戻り値(return)

DateTime

指定された日時から期間を減算した結果をDateTimeオブジェクトとして返します。

サンプルコード

PHPで現在日時から1日減算する

<?php

/**
 * 現在の日時から1日を減算し、結果を表示するサンプルコード。
 *
 * date_sub() 関数は、指定されたDateTimeオブジェクトから指定された期間を減算します。
 * この関数は、最初の引数として渡されたDateTimeオブジェクト自体を更新し、
 * 更新されたDateTimeオブジェクトを返します。
 */

// 1. 現在の日時を表すDateTimeオブジェクトを作成します。
$currentDate = new DateTime();
echo "現在の年月日と時間: " . $currentDate->format('Y-m-d H:i:s') . "\n";

// 2. 1日を表すDateIntervalオブジェクトを作成します。
//    'P1D' は 'Period 1 Day' を意味します。
$oneDayInterval = new DateInterval('P1D');

// 3. date_sub() 関数を使用して、現在の日時から1日を減算します。
//    $currentDateオブジェクト自体が更新されます。
$modifiedDate = date_sub($currentDate, $oneDayInterval);

// 4. 1日減算された日時を表示します。
//    $currentDateと$modifiedDateは、同じ更新されたDateTimeオブジェクトを参照しています。
echo "1日減算後の年月日と時間: " . $modifiedDate->format('Y-m-d H:i:s') . "\n";

?>

PHPのdate_sub関数は、指定した日時から特定の期間を減算するために使用されます。この関数は、最初の引数であるDateTimeオブジェクト(減算の基準となる日時)から、2番目の引数であるDateIntervalオブジェクト(減算したい期間)を差し引きます。この関数の非常に重要な挙動として、渡されたDateTimeオブジェクト自体が更新される点が挙げられます。そして、更新されたDateTimeオブジェクトを戻り値として返します。

サンプルコードでは、まずnew DateTime()で現在の日時を表すオブジェクトを作成し、現在の年月日と時間を表示しています。次に、new DateInterval('P1D')を使って「1日」という期間を表すオブジェクトを作成します。ここで使われる'P1D'は「Period 1 Day」の略で、1日を意味します。その後、date_sub()関数に現在の日時オブジェクトと1日の期間オブジェクトを渡すことで、現在の日時から1日を減算します。この操作によって、元の現在の日時オブジェクトは1日前の日付に更新されます。最終的に、更新された日時オブジェクトの値を表示し、1日減算された結果を確認することができます。このようにdate_sub関数を使うと、日付や時刻の計算を効率的に行えます。

date_sub関数は、最初の引数として渡されたDateTimeオブジェクト自体を直接変更します。そのため、関数実行後には元の$currentDate変数も更新された日時を保持しています。新しい日時オブジェクトが生成されて返されるのではなく、変更された元のオブジェクト自身が戻り値となります。もし元の日時情報を保持したまま減算結果を得たい場合は、date_subを呼び出す前にDateTimeオブジェクトをclone(複製)して渡してください。

PHPで現在日時から1ヶ月前を計算する

<?php

/**
 * 現在の日時から1ヶ月前の日時を計算して表示する関数。
 *
 * date_sub関数を使用して、指定されたDateTimeオブジェクトから
 * DateIntervalオブジェクトで定義された期間を減算します。
 */
function calculateOneMonthAgo(): void
{
    // 現在の日時を表すDateTimeオブジェクトを作成します。
    // PHP 8.0以降では、DateTimeImmutableを推奨されるケースもありますが、
    // ここではdate_sub関数の引数型に合わせてDateTimeを使用します。
    $currentDateTime = new DateTime();

    // 1ヶ月間隔を表すDateIntervalオブジェクトを作成します。
    // 'P1M' は「期間1ヶ月」を意味します。
    $oneMonthInterval = new DateInterval('P1M');

    // date_sub関数を使用して、現在の日時から1ヶ月を減算します。
    // date_subはDateTimeオブジェクト自体を変更し、そのオブジェクトを返します。
    $oneMonthAgo = date_sub($currentDateTime, $oneMonthInterval);

    // 結果の日時を分かりやすい形式で表示します。
    echo "現在の日時: " . (new DateTime())->format('Y-m-d H:i:s') . "\n";
    echo "1ヶ月前の日時: " . $oneMonthAgo->format('Y-m-d H:i:s') . "\n";
}

// 関数を実行し、結果を出力します。
calculateOneMonthAgo();

このサンプルコードは、PHPのdate_sub関数を使用して、現在の日時から指定した期間(この場合は1ヶ月)を減算し、過去の日時を計算する方法を示しています。date_sub関数は、あるDateTimeオブジェクトから、別のDateIntervalオブジェクトで定義された期間を減算するために使われます。

まず、new DateTime()で現在の年月日と時刻を表すDateTimeオブジェクトを作成します。次に、new DateInterval('P1M')を使って「1ヶ月」という期間を定義するDateIntervalオブジェクトを作成します。このP1Mは「期間(Period)1ヶ月」を意味するISO 8601形式の表記です。

そして、date_sub関数にこれら二つのオブジェクトを渡して呼び出します。第一引数$objectには基準となるDateTimeオブジェクト(現在の時刻)、第二引数$intervalには減算したい期間を表すDateIntervalオブジェクトを指定します。date_sub関数は、第一引数で渡されたDateTimeオブジェクト自体を直接変更し、その変更後のDateTimeオブジェクトを戻り値として返します。このため、元の$currentDateTime変数の値が1ヶ月前の日時になります。最後に、変更されたDateTimeオブジェクトをformat('Y-m-d H:i:s')で読みやすい形式に整形して表示し、現在の日時と1ヶ月前の日時を比較して確認することができます。

このdate_sub関数は、第一引数に渡されたDateTimeオブジェクトの日時自体を変更する(破壊的である)点に注意が必要です。元のDateTimeオブジェクトの日時を保持したまま減算したい場合は、事前にオブジェクトをクローンするか、DateTimeImmutableクラスとそのsubメソッドの使用をご検討ください。DateTimeImmutableは元のオブジェクトを変更しないため、より安全で予測しやすいコードになります。また、減算する期間を指定するDateIntervalオブジェクトは、P1Mのように国際標準であるISO 8601に基づいた書式で指定しますので、正しい記述方法を確認してください。これらの点を理解し、安全に日時計算を行いましょう。

【PHP8.x】date_sub関数の使い方 | いっしー@Webエンジニア