【PHP8.x】subメソッドの使い方

subメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

subメソッドは、DateTimeImmutableオブジェクトに保持されている日時情報から、指定された期間を減算し、その結果を表す新しいDateTimeImmutableオブジェクトを生成するメソッドです。DateTimeImmutableクラスのオブジェクトは一度作成されると内容が変更されない(イミュータブルである)という特性を持つため、このsubメソッドは呼び出し元のオブジェクト自体を書き換えることはありません。代わりに、減算された新しい日時情報を持つDateTimeImmutableオブジェクトを返します。これにより、元の時間データが安全に保たれ、意図しない副作用を防ぐことができます。

減算する期間は、DateIntervalクラスのインスタンスとして引数に指定します。DateIntervalオブジェクトは、「P1D」(1日)や「PT5H30M」(5時間30分)のように、年、月、日、時間、分、秒といった具体的な時間の間隔を表現します。例えば、今日の日付から特定の日数前の日付を計算したい場合や、ある時刻から数時間前の時刻を求めたい場合にsubメソッドが非常に便利です。このメソッドを利用することで、日付や時刻の複雑な計算を直感的かつ安全に実行できます。常にDateTimeImmutableの新しいインスタンスを返すため、メソッドチェーンを利用して複数の日時操作を続けて行うことも可能です。

構文(syntax)

1<?php
2$date = new DateTimeImmutable('2023-10-27 10:00:00');
3$interval = new DateInterval('P1M'); // 1ヶ月
4$newDate = $date->sub($interval);
5echo $newDate->format('Y-m-d H:i:s');
6?>

引数(parameters)

DateInterval $interval

  • DateInterval $interval: 減算する期間を指定するDateIntervalオブジェクト

戻り値(return)

DateTimeImmutable

指定された日付から指定された期間を減算した新しい DateTimeImmutable オブジェクトを返します。

サンプルコード

PHP DateTimeImmutable::sub()で日付を減算する

1<?php
2
3/**
4 * DateTimeImmutable::sub() メソッドの基本的な使用例。
5 * 例えば、Webフォームなどでユーザーが入力した日付から、指定された期間を減算する際などに利用できます。
6 * DateTimeImmutable オブジェクトはイミュータブル(不変)であり、sub() メソッドは元のオブジェクトを変更せず、新しいオブジェクトを返します。
7 */
8function demonstrateDateTimeImmutableSub(): void
9{
10    // 基準となるDateTimeImmutableオブジェクトを作成します。
11    // 例として、特定の日付を使用します。実際には現在の日付や、フォームからの入力値などを使用できます。
12    $baseDate = new DateTimeImmutable('2023-10-26 10:00:00');
13    echo "元のDateTimeImmutableオブジェクト: " . $baseDate->format('Y-m-d H:i:s') . "\n";
14
15    // 減算する期間を定義するDateIntervalオブジェクトを作成します。
16    // "P1M5D" は「1ヶ月と5日」を表します(P: Period, M: Month, D: Day)。
17    // 例えば、ユーザーが「1ヶ月と5日前」という条件をフォームで「submit」したと想定できます。
18    $interval = new DateInterval('P1M5D');
19
20    // sub() メソッドを使用して、元のオブジェクトから期間を減算します。
21    // sub() は元のオブジェクトを変更せず、減算結果を持つ新しいDateTimeImmutableオブジェクトを返します。
22    $newDate = $baseDate->sub($interval);
23
24    echo "減算する期間: 1ヶ月と5日\n";
25    echo "減算後のDateTimeImmutableオブジェクト: " . $newDate->format('Y-m-d H:i:s') . "\n";
26
27    // 元のDateTimeImmutableオブジェクトは変更されていないことを確認できます。
28    echo "元のDateTimeImmutableオブジェクト (変更なし): " . $baseDate->format('Y-m-d H:i:s') . "\n";
29
30    // 別の例:現在の日時から2時間30分を減算
31    $now = new DateTimeImmutable();
32    echo "\n現在のDateTimeImmutableオブジェクト: " . $now->format('Y-m-d H:i:s') . "\n";
33
34    $timeInterval = new DateInterval('PT2H30M'); // "PT2H30M" は「2時間30分」を表します (T: Time, H: Hour, M: Minute)。
35    $pastTime = $now->sub($timeInterval);
36
37    echo "減算する期間: 2時間30分\n";
38    echo "減算後のDateTimeImmutableオブジェクト: " . $pastTime->format('Y-m-d H:i:s') . "\n";
39}
40
41// 関数を実行してサンプルコードの動作を確認します。
42demonstrateDateTimeImmutableSub();

PHPのDateTimeImmutable::sub()メソッドは、日付や時刻から指定された期間を減算し、新しいDateTimeImmutableオブジェクトを生成するために使用されます。このメソッドは、所属クラス名が示す通りDateTimeImmutableオブジェクトの「不変性」という特性を尊重します。つまり、sub()を呼び出しても元のDateTimeImmutableオブジェクトは変更されず、減算された結果を持つ新しいDateTimeImmutableオブジェクトが戻り値として返される点が重要です。

引数にはDateIntervalオブジェクトを指定します。このDateIntervalは「1ヶ月と5日」や「2時間30分」といった具体的な期間を表現するオブジェクトです。例えば、Webフォームなどでユーザーが特定の期間を「submit」し、その期間を現在の日付や指定された日付から減算して過去の日付を求めるような場面で特に役立ちます。

このようにDateTimeImmutable::sub()メソッドを利用することで、元の情報を安全に保ちながら、日付や時刻を柔軟かつ正確に操作することが可能になります。

DateTimeImmutable::sub()は、元のオブジェクトを変更せずに、減算結果を持つ新しいDateTimeImmutableオブジェクトを返します。元のオブジェクトが変更されるわけではない点にご注意ください。減算する期間はDateIntervalオブジェクトで指定し、「P1M5D」(1ヶ月と5日)や「PT2H30M」(2時間30分)のような書式に慣れる必要があります。

Webフォームなどで日付や期間が送信(submit)される場合、ユーザーの入力値が正しくDateTimeImmutableDateIntervalで扱える形式か、必ずバリデーション(検証)を行ってください。また、日付計算の結果が現実的に存在しない日付(例:2月30日)になる場合、PHPが自動で日付を調整する挙動を示すことがあるため、意図しない結果にならないよう十分な確認が必要です。

PHP DateTimeImmutable sub()で日時を減算する

1<?php
2
3/**
4 * DateTimeImmutable::sub() メソッドの使用例。
5 *
6 * この関数は、現在の日時から指定された期間を減算する方法を示します。
7 * DateTimeImmutable::sub() は元のオブジェクトを変更せず、
8 * 新しいDateTimeImmutableオブジェクトを返します。
9 */
10function demonstrateDateTimeImmutableSub(): void
11{
12    // 現在の日時を表すDateTimeImmutableオブジェクトを作成
13    $currentDate = new DateTimeImmutable();
14    echo "現在の日時: " . $currentDate->format('Y-m-d H:i:s') . PHP_EOL;
15
16    // 10日間と5時間減算するためのDateIntervalオブジェクトを作成
17    // 'P10DT5H' は "Period 10 Days Time 5 Hours" を意味します
18    $intervalToSubtract = new DateInterval('P10DT5H');
19    echo "減算する期間: " . $intervalToSubtract->format('%d日と%h時間') . PHP_EOL;
20
21    // sub() メソッドを使用して日時を減算し、新しいDateTimeImmutableオブジェクトを取得
22    $pastDate = $currentDate->sub($intervalToSubtract);
23    echo "10日と5時間前の日時: " . $pastDate->format('Y-m-d H:i:s') . PHP_EOL;
24
25    // 元のオブジェクトは変更されていないことを確認
26    echo "元のオブジェクト(現在の日時)は変更されていません: " . $currentDate->format('Y-m-d H:i:s') . PHP_EOL;
27}
28
29// 関数を実行してデモンストレーションを開始
30demonstrateDateTimeImmutableSub();

DateTimeImmutable::sub()メソッドは、PHPで日付と時刻を扱うDateTimeImmutableクラスの機能の一つで、現在の日時から指定された期間を減算するために使用されます。PHP 8で利用可能です。

このメソッドは引数としてDateIntervalオブジェクトを受け取ります。DateIntervalオブジェクトは、「10日間」や「5時間」といった具体的な期間を定義するために使われ、例えばnew DateInterval('P10DT5H')と記述することで「10日間と5時間」という期間を指定できます。

sub()メソッドの戻り値は、減算された日時を持つ新しいDateTimeImmutableオブジェクトです。DateTimeImmutableクラスの大きな特徴は、その名前の通り「不変(immutable)」である点にあります。そのため、sub()メソッドを実行しても、元のDateTimeImmutableオブジェクトは一切変更されず、減算結果は常に新しいオブジェクトとして返されます。これにより、元のデータを安全に保ちながら日時の計算を行うことが可能です。

サンプルコードでは、まず現在の時刻をDateTimeImmutableオブジェクトとして取得します。次に、減算したい期間をDateIntervalオブジェクト(例:10日と5時間)として定義し、それをsub()メソッドに渡しています。その結果、指定された期間だけ過去の日時が新しいDateTimeImmutableオブジェクトとして返され、元の時刻オブジェクトが変更されていないことが確認できます。

DateTimeImmutable::subメソッドは、指定期間を減算し、新しいDateTimeImmutableオブジェクトを返します。キーワードとして提示されたphp substrは文字列操作の関数であり、日付操作のsubメソッドとは全く異なるため、混同しないよう注意が必要です。このメソッドはDateTimeImmutableクラスに属するため、元のオブジェクトは変更されません。減算結果は必ず新しいDateTimeImmutableオブジェクトとして返されますので、その戻り値を変数で受け取って利用してください。引数にはP10DT5Hのような期間指定文字列を用いてDateIntervalオブジェクトを作成し渡します。Pは期間、Tは時間指定の開始を示すルールがあり、正しい形式で記述することが重要です。