【PHP8.x】DateTimeImmutable::modify()メソッドの使い方
modifyメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
modifyメソッドは、DateTimeImmutableオブジェクトの日付と時刻を変更し、新しいDateTimeImmutableオブジェクトを返します。このメソッドは、元のDateTimeImmutableオブジェクトを変更せずに、新しいオブジェクトを生成するため、DateTimeImmutableオブジェクトの不変性を保ちます。
modifyメソッドは、日付と時刻の変更を記述した文字列(例えば、"+1 day", "-2 weeks", "next Monday"など)を引数として受け取ります。この文字列は、PHPが解釈できる形式である必要があります。文字列の形式が正しくない場合、例外が発生する可能性があります。
modifyメソッドは、指定された変更を適用した新しいDateTimeImmutableオブジェクトを返します。元のDateTimeImmutableオブジェクトは変更されません。変更に失敗した場合(例えば、無効な日付文字列が渡された場合)、falseを返します。
modifyメソッドは、DateTimeImmutableオブジェクトの日付と時刻を操作するための重要なツールです。DateTimeImmutableオブジェクトの不変性を維持しながら、日付と時刻の計算や調整を行うことができます。例えば、特定の日から1週間後の日付を計算したり、特定の日から数日前の日付を計算したりする際に使用できます。また、"first day of next month" のような自然言語に近い表現も使用できるため、柔軟な日付操作が可能です。
modifyメソッドを使用する際には、日付文字列の形式に注意する必要があります。PHPが解釈できる形式で記述されていることを確認してください。また、無効な日付文字列を渡すと、例外が発生する可能性があるため、事前にバリデーションを行うことを推奨します。
例:
$date = new DateTimeImmutable('2024-01-01');
$newDate = $date->modify('+1 day');
echo $newDate->format('Y-m-d'); // 出力:2024-01-02
上記の例では、2024年1月1日のDateTimeImmutableオブジェクトに対して、modifyメソッドを使用して1日後の日付を計算し、新しいDateTimeImmutableオブジェクトとして取得しています。
構文(syntax)
1DateTimeImmutable::modify(string $modifier): DateTimeImmutable|false
引数(parameters)
string $modifier
- string $modifier: 日付の変更内容を指定する文字列
戻り値(return)
DateTimeImmutable
DateTimeImmutable オブジェクトの新しいインスタンスを返します。この新しいインスタンスは、指定されたフォーマット文字列に従って元のオブジェクトの日付/時刻が変更されたものです。
サンプルコード
PHP: DateTimeImmutable配列の日付を変更する
1<?php 2 3/** 4 * DateTimeImmutable オブジェクトの配列を反復処理し、 5 * 各日付を指定された修飾子で変更した新しい DateTimeImmutable オブジェクトの配列を生成します。 6 * 7 * DateTimeImmutable オブジェクトは「不変 (immutable)」です。 8 * そのため、modify() メソッドを呼び出しても元のオブジェクトは変更されず、 9 * 新しい DateTimeImmutable インスタンスが返されます。 10 * この関数では、その新しいインスタンスを結果の配列に追加します。 11 * 12 * @param DateTimeImmutable[] $dates DateTimeImmutable オブジェクトの配列 13 * @param string $modifier modify() メソッドに渡す修飾文字列 (例: '+1 day', '-2 hours') 14 * @return DateTimeImmutable[] 変更された DateTimeImmutable オブジェクトの新しい配列 15 */ 16function modifyDatesInArray(array $dates, string $modifier): array 17{ 18 $modifiedDates = []; 19 foreach ($dates as $date) { 20 // DateTimeImmutable::modify は新しい DateTimeImmutable インスタンスを返す 21 // 元の $date オブジェクトは変更されません 22 $modifiedDates[] = $date->modify($modifier); 23 } 24 return $modifiedDates; 25} 26 27// --- サンプルコードの実行 --- 28 29// 1. 元になる DateTimeImmutable オブジェクトの配列を作成 30$initialDates = [ 31 new DateTimeImmutable('2023-01-01 10:00:00'), 32 new DateTimeImmutable('2023-02-15 14:30:00'), 33 new DateTimeImmutable('2023-03-30 08:00:00'), 34]; 35 36echo "--- 元の日付 ---\n"; 37foreach ($initialDates as $date) { 38 echo $date->format('Y-m-d H:i:s') . "\n"; 39} 40 41// 2. modifyDatesInArray 関数を呼び出し、各日付を「+1週間」変更 42$modifier = '+1 week'; 43$oneWeekLaterDates = modifyDatesInArray($initialDates, $modifier); 44 45echo "\n--- 1週間後の日付 ---\n"; 46foreach ($oneWeekLaterDates as $date) { 47 echo $date->format('Y-m-d H:i:s') . "\n"; 48} 49 50// 3. 元の配列が変更されていないことを確認 (DateTimeImmutable の不変性の確認) 51echo "\n--- 元の日付 (再確認 - 変更されていない) ---\n"; 52foreach ($initialDates as $date) { 53 echo $date->format('Y-m-d H:i:s') . "\n"; 54} 55 56// 別の変更も試す: 各日付を「-2時間」変更 57$anotherModifier = '-2 hours'; 58$twoHoursBeforeDates = modifyDatesInArray($initialDates, $anotherModifier); 59 60echo "\n--- 2時間前の日付 ---\n"; 61foreach ($twoHoursBeforeDates as $date) { 62 echo $date->format('Y-m-d H:i:s') . "\n"; 63}
PHPのDateTimeImmutableクラスは、日付と時刻を扱うオブジェクトで、その名の通り「不変(immutable)」な特性を持っています。一度作成されたオブジェクトは、その内容が変更されることはありません。modifyメソッドは、このDateTimeImmutableオブジェクトの日付や時刻を変更する際に使用し、引数$modifierに'+1 day'や'-2 hours'のような変更内容を示す文字列を指定します。このメソッドを呼び出すと、元のオブジェクトを変更するのではなく、指定された変更が適用された「新しいDateTimeImmutableオブジェクト」が戻り値として返されます。
サンプルコードでは、DateTimeImmutableオブジェクトの配列をforeachループで反復処理しています。ループ内で各日付オブジェクトに対してmodifyメソッドを呼び出すことで、元の日付から指定期間だけ変更された「新しい日付オブジェクト」が生成されます。この新しいオブジェクトを別の配列に収集することで、元の配列に影響を与えることなく、変更後の結果をまとめた新しい配列を得ています。コードの実行結果でも確認できる通り、modifyメソッドを呼び出した後も、元の$initialDates配列の内容は変更されずに保持されており、これがDateTimeImmutableクラスの不変性の重要なポイントです。
DateTimeImmutableは不変(immutable)なオブジェクトです。そのため、modifyメソッドを呼び出しても、元のDateTimeImmutableオブジェクト自体は変更されません。日時が変更された新しいDateTimeImmutableオブジェクトが戻り値として返されますので、この戻り値を必ず受け取って利用する必要があります。サンプルコードでは、foreachループ内でこの新しいオブジェクトを$modifiedDates配列に格納しています。元の配列の要素はそのまま維持されるため、意図せず元のデータが変更される心配がなく、安全に日時操作を行える点が大きな特徴です。
PHP DateTimeImmutable modifyで月を操作する
1<?php 2 3// DateTimeImmutableクラスは、一度作成されると値が変更されない(不変な)日付と時刻のオブジェクトを扱います。 4// modify()メソッドを呼び出すと、元のオブジェクトを変更するのではなく、 5// 変更が適用された新しいDateTimeImmutableオブジェクトが返されます。 6 7// 1. 現在の日付と時刻でDateTimeImmutableオブジェクトを生成します。 8$currentDate = new DateTimeImmutable(); 9echo "現在の日付: " . $currentDate->format('Y-m-d') . "\n"; 10 11// 2. modify()メソッドを使って1ヶ月後の日付を取得します。 12// 引数 '+1 month' は、現在の月に1ヶ月加算することを指示します。 13$oneMonthLater = $currentDate->modify('+1 month'); 14echo "1ヶ月後の日付: " . $oneMonthLater->format('Y-m-d') . "\n"; 15 16// 3. modify()メソッドを使って2ヶ月前の日付を取得します。 17// 引数 '-2 months' は、現在の月から2ヶ月減算することを指示します。 18$twoMonthsAgo = $currentDate->modify('-2 months'); 19echo "2ヶ月前の日付: " . $twoMonthsAgo->format('Y-m-d') . "\n"; 20 21// 4. modify()メソッドを使って次の月の最初の日を取得します。 22// 引数 'first day of next month' は、文字通り「次の月の最初の日」を意味します。 23$firstDayOfNextMonth = $currentDate->modify('first day of next month'); 24echo "次の月の最初の日: " . $firstDayOfNextMonth->format('Y-m-d') . "\n"; 25 26?>
DateTimeImmutable::modify()メソッドは、PHPで日付や時刻を扱うDateTimeImmutableクラスのオブジェクトに対し、指定したルールに基づいて日付や時刻を変更するための機能です。
DateTimeImmutableクラスのオブジェクトは、一度作成されると値が変更されない「不変(immutable)」な特性を持っています。そのため、modify()メソッドを呼び出すと、元のオブジェクト自体を変更するのではなく、変更が適用された新しいDateTimeImmutableオブジェクトを生成し、それを戻り値として返します。元のオブジェクトは影響を受けずにそのまま残ります。
引数$modifierには、日付や時刻の変更内容を指示する文字列を渡します。例えば、「+1 month」と指定すれば1ヶ月後の日付、「-2 months」と指定すれば2ヶ月前の日付を計算できます。また、「first day of next month」のように、より複雑で具体的な日付の指定も可能です。
このメソッドを利用することで、現在の日付から将来や過去の特定の日付を簡単に取得したり、「次の月の最初の日」といった条件での日付計算を直感的な文字列で記述し、新しいDateTimeImmutableオブジェクトとして取得できます。これにより、日付に関する処理を簡潔かつ安全に行うことが可能になります。
DateTimeImmutable::modify()メソッドは、元のオブジェクト自体を変更するのではなく、操作結果を反映した新しいDateTimeImmutableオブジェクトを返します。そのため、必ず戻り値を変数に代入して利用してください。元のオブジェクトは不変(Immutable)である点が重要です。
引数$modifierには'+1 month'や'first day of next month'のように柔軟な文字列を指定できますが、特に月末の日付計算やうるう年などでは、意図しない結果になる可能性があります。例えば、31日の月に'+1 month'を加えると、次の月の最終日に調整されることがあります。そのため、結果が想定通りか十分に確認し、エッジケースでの挙動を理解しておくことが安全な利用に繋がります。