【PHP8.x】DateTime::add()メソッドの使い方
addメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
addメソッドは、DateTimeオブジェクトが示す日付と時刻に、指定した期間を加算するために実行するメソッドです。このメソッドは、引数として「期間」を表すDateIntervalオブジェクトを受け取ります。addメソッドを呼び出すと、元のDateTimeオブジェクトの値が直接変更され、加算後の日時に更新されます。新しいオブジェクトを生成するのではなく、呼び出し元のオブジェクト自体を書き換えるという点が特徴です。処理が成功すると、変更されたDateTimeオブジェクト自身が返され、失敗した場合はfalseが返ります。例えば、「2025年10月31日」を表すDateTimeオブジェクトに、「1ヶ月と5日間」の期間を持つDateIntervalオブジェクトを渡してこのメソッドを実行すると、元のオブジェクトは「2025年12月5日」に更新されます。このように、特定の日付を基準として未来の日付や時刻を正確に算出する際に使用される、基本的ながらも非常に重要なメソッドです。
構文(syntax)
1<?php 2 3// 元となる日付のオブジェクトを作成します。 4$date = new DateTime('2023-10-26'); 5 6// 加算する期間(この例では10日間)のオブジェクトを作成します。 7$interval = new DateInterval('P10D'); 8 9// addメソッドで、日付オブジェクトに期間オブジェクトを加算します。 10$date->add($interval); 11 12// 結果を 'Y-m-d' 形式の文字列で出力します。 13echo $date->format('Y-m-d'); 14 15?>
引数(parameters)
DateInterval $interval
- DateInterval $interval: 追加する期間を指定するDateIntervalオブジェクト
戻り値(return)
DateTime
指定されたDateTimeオブジェクトに指定された期間を加算した新しいDateTimeオブジェクトを返します。
サンプルコード
PHP DateTime::add で日付期間を加算する
1<?php 2 3/** 4 * 現在の日付に指定した期間を加算し、その結果を表示する関数です。 5 * この関数は、PHPのDateTimeクラスのaddメソッドを使用して、 6 * 日付に特定の時間間隔(年、月、日など)を追加する方法を示します。 7 * 8 * @param string $intervalSpec 加算する時間間隔を表す文字列 (例: 'P1M' は1ヶ月、'P7D' は7日)。 9 * ISO 8601 期間形式に従います。 10 * 詳細はPHPマニュアルのDateInterval::__constructをご確認ください。 11 * @return void 12 */ 13function demonstrateDateTimeAdd(string $intervalSpec): void 14{ 15 // 現在の日時を表すDateTimeオブジェクトを作成します。 16 // これは、操作の開始点となります。 17 $currentDateTime = new DateTime(); 18 echo "現在の出発日時: " . $currentDateTime->format('Y-m-d H:i:s') . "\n"; 19 20 try { 21 // 加算する期間を定義するDateIntervalオブジェクトを作成します。 22 // 例えば 'P1M' は「1ヶ月」を意味します。 23 $interval = new DateInterval($intervalSpec); 24 25 // DateTime::add() メソッドを使用して、現在のDateTimeオブジェクトに期間を加算します。 26 // このメソッドは、変更されたDateTimeオブジェクト自身を返します。 27 // PHP 8では、元のオブジェクトが変更され、その変更されたオブジェクトが返されます。 28 $futureDateTime = $currentDateTime->add($interval); 29 30 echo "加算後の日時 ('{$intervalSpec}'): " . $futureDateTime->format('Y-m-d H:i:s') . "\n"; 31 32 } catch (Exception $e) { 33 // DateIntervalの指定が不正な場合にエラーを捕捉し、メッセージを表示します。 34 echo "エラー: 指定された時間間隔 '{$intervalSpec}' が無効です。 (" . $e->getMessage() . ")\n"; 35 } 36} 37 38// --- サンプルコードの実行例 --- 39 40// 1ヶ月後を計算する例 41echo "--- 1ヶ月後を計算 ---\n"; 42demonstrateDateTimeAdd('P1M'); 43 44echo "\n"; 45 46// 7日後を計算する例 47echo "--- 7日後を計算 ---\n"; 48demonstrateDateTimeAdd('P7D'); 49 50echo "\n"; 51 52// 3年2ヶ月1日後を計算する例 53echo "--- 3年2ヶ月1日後を計算 ---\n"; 54demonstrateDateTimeAdd('P3Y2M1D'); 55 56echo "\n"; 57 58// 5時間30分15秒後を計算する例 59echo "--- 5時間30分15秒後を計算 ---\n"; 60demonstrateDateTimeAdd('PT5H30M15S'); 61 62echo "\n"; 63 64// 不正な時間間隔の指定でエラーハンドリングをテストする例 65echo "--- 不正な時間間隔の例 ---\n"; 66demonstrateDateTimeAdd('INVALID_INTERVAL'); 67 68?>
PHPのDateTime::addメソッドは、現在の日付や時刻を表すDateTimeオブジェクトに、指定した期間を加算するために使用されます。このメソッドは、DateTimeクラスに属し、日付計算を柔軟に行うことができます。
引数にはDateIntervalオブジェクトを渡します。このDateIntervalは、加算したい期間(例: 'P1M'で1ヶ月、'P7D'で7日、'PT5H30M15S'で5時間30分15秒)をISO 8601期間形式で定義したものです。
addメソッドが実行されると、呼び出し元のDateTimeオブジェクト自身が更新され、その変更されたDateTimeオブジェクトが戻り値として返されます。これにより、日付や時刻を容易に未来へ進めることができます。
サンプルコードでは、現在の日時を起点に、様々な期間(1ヶ月、7日、3年2ヶ月1日、5時間30分15秒)を加算した結果を表示しています。また、DateIntervalの指定が不正な場合に発生するエラーを捕捉し、適切なメッセージを表示するエラーハンドリングの例も含まれており、堅牢なコード作成のヒントを提供しています。
DateTime::add() メソッドは、呼び出し元の DateTime オブジェクト自身を変更し、その変更されたオブジェクトを返します。新しい DateTime オブジェクトが生成されるわけではないため、元のオブジェクトも更新される点にご注意ください。加算する期間を指定する DateInterval オブジェクトの書式は、ISO 8601 期間形式に厳密に従う必要があります。不正な書式の場合には DateInterval のコンストラクタで例外が発生するため、サンプルコードのように try-catch ブロックを用いて必ず例外処理を行い、プログラムの予期せぬ停止を防ぐようにしてください。
PHP DateTime::addで期間を追加する
1<?php 2 3/** 4 * 現在の日付に指定された期間を追加し、結果を表示するサンプル関数です。 5 * DateTime::add メソッドは、指定された DateInterval オブジェクトによって 6 * DateTime オブジェクトの値を変更し、その変更された DateTime オブジェクト自身を返します。 7 * 8 * @param string $intervalSpec DateInterval コンストラクタで解析可能な期間の指定文字列 (例: 'P10D' は10日間、'PT2H' は2時間)。 9 * @return void 10 */ 11function addIntervalToCurrentDateTime(string $intervalSpec): void 12{ 13 // 現在の日付と時刻を表す DateTime オブジェクトを作成します。 14 $currentDateTime = new DateTime(); 15 echo "現在の年月日と時間: " . $currentDateTime->format('Y-m-d H:i:s') . PHP_EOL; 16 17 try { 18 // 追加したい期間を定義する DateInterval オブジェクトを作成します。 19 // 例: 'P10D' は10日間、'PT2H' は2時間。 20 // 'P' は期間(Period)を示し、その後に年(Y), 月(M), 日(D) の数値が続きます。 21 // 'T' は時間(Time)の区切りを示し、その後に時間(H), 分(M), 秒(S) の数値が続きます。 22 $interval = new DateInterval($intervalSpec); 23 24 // DateTime::add() メソッドを使用して、現在の DateTime オブジェクトに期間を追加します。 25 // このメソッドは元のオブジェクトを変更し、その変更された DateTime オブジェクト自身を返します。 26 $modifiedDateTime = $currentDateTime->add($interval); 27 28 echo "追加された期間: " . $intervalSpec . PHP_EOL; 29 echo "期間追加後の年月日と時間: " . $modifiedDateTime->format('Y-m-d H:i:s') . PHP_EOL; 30 31 } catch (Exception $e) { 32 // DateInterval の指定が不正な場合などに例外を捕捉します。 33 echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL; 34 } 35} 36 37// --- サンプルコードの実行 --- 38 39// 例1: 現在の日付に10日間と2時間を追加します。 40echo "--- 例1: 10日2時間を追加 ---" . PHP_EOL; 41addIntervalToCurrentDateTime('P10DT2H'); 42echo PHP_EOL; // 出力を見やすくするための改行 43 44// 例2: 現在の日付に1年と3ヶ月を追加します。 45echo "--- 例2: 1年3ヶ月を追加 ---" . PHP_EOL; 46addIntervalToCurrentDateTime('P1Y3M'); 47 48?>
PHPのDateTime::addメソッドは、特定の日付と時刻を表すDateTimeオブジェクトに、指定された期間(時間)を追加するための機能です。このメソッドは、引数としてDateIntervalオブジェクトを受け取ります。
DateIntervalオブジェクトは、「10日間」や「2時間」といった具体的な期間を定義するために使用され、「P10D」(10日間)や「PT2H」(2時間)のような特定の書式を用いて作成します。ここでPは期間(Period)、Tは時間(Time)の区切りを示します。
addメソッドが実行されると、呼び出し元のDateTimeオブジェクト自体が変更され、指定された期間が追加された新しい日時になります。そして、その変更されたDateTimeオブジェクト自身が戻り値として返されます。そのため、メソッドの実行結果を別の変数に代入して使うことも、元の変数をそのまま利用して処理を続けることも可能です。
このサンプルコードでは、まず現在の日時を表すDateTimeオブジェクトを作成しています。次に、DateIntervalオブジェクトで「10日間と2時間」や「1年と3ヶ月」といった期間を定義し、addメソッドを使って現在の日時にその期間を追加しています。これにより、将来の日時を簡単に計算し、結果を表示しています。
DateTime::addメソッドは、呼び出したDateTimeオブジェクト自体を直接変更する「破壊的」な操作である点にご注意ください。新しい日付時刻オブジェクトを生成するわけではありません。元のDateTimeオブジェクトを変更せずに期間を追加したい場合は、addメソッドを呼び出す前にcloneキーワードでオブジェクトを複製してから操作を行ってください。また、引数となるDateIntervalの指定文字列は厳密なフォーマットが求められます。不正なフォーマットは例外(Exception)を発生させるため、サンプルコードのようにtry-catchブロックを使用してエラーを適切に処理することが安全な利用のために重要です。
addslashesで文字列をエスケープする
1<?php 2 3/** 4 * addslashes() 関数の動作を確認するサンプルコード 5 * 6 * この関数は、シングルクォート、ダブルクォート、バックスラッシュ、NUL文字の前に 7 * バックスラッシュを追加して文字列をエスケープします。 8 */ 9function demonstrateAddslashes(): void 10{ 11 // エスケープ対象の文字列を準備 12 $string1 = "It's a beautiful day."; // シングルクォートを含む 13 $string2 = 'He said, "Hello World!"'; // ダブルクォートを含む 14 $string3 = 'C:\Users\John'; // バックスラッシュを含む 15 16 // addslashes() を使って各文字列をエスケープ 17 $escapedString1 = addslashes($string1); 18 $escapedString2 = addslashes($string2); 19 $escapedString3 = addslashes($string3); 20 21 // 結果を出力して比較 22 echo "Original 1 : " . $string1 . PHP_EOL; 23 echo "Escaped 1 : " . $escapedString1 . PHP_EOL; 24 echo PHP_EOL; 25 26 echo "Original 2 : " . $string2 . PHP_EOL; 27 echo "Escaped 2 : " . $escapedString2 . PHP_EOL; 28 echo PHP_EOL; 29 30 echo "Original 3 : " . $string3 . PHP_EOL; 31 echo "Escaped 3 : " . $escapedString3 . PHP_EOL; 32} 33 34// 関数を実行 35demonstrateAddslashes(); 36 37?>
このPHPコードは、addslashes() 関数の基本的な使い方を示すサンプルです。addslashes() は、引数として受け取った文字列の中に含まれる特定の文字を「エスケープ」処理するための関数です。エスケープとは、シングルクォート(')、ダブルクォート(")、バックスラッシュ(\)といった、プログラム上で特別な意味を持つ可能性のある文字の前に、バックスラッシュを追加してその特殊な意味を打ち消す処理を指します。
このサンプルコードでは、まずシングルクォート、ダブルクォート、バックスラッシュをそれぞれ含む3つの異なる文字列($string1、$string2、$string3)を準備しています。次に、これらの文字列を addslashes() 関数に渡しています。関数は、エスケープ処理を行った新しい文字列を戻り値として返し、それを $escapedString1 などの新しい変数に代入しています。
最後に、echo を使って処理前の元の文字列と、addslashes() によってエスケープされた後の文字列を並べて出力しています。これにより、各記号の前にバックスラッシュが正しく追加されていることを視覚的に確認できます。
addslashes()関数は、データベースへのクエリに使われる文字列をエスケープする目的での使用は現在強く非推奨です。この関数だけでは、SQLインジェクションと呼ばれるセキュリティ上の脆弱性を完全に防ぐことができないためです。データベースを安全に操作するためには、PDOやMySQLiが提供するプリペアドステートメントとプレースホルダの使用が必須です。これにより、SQL文とデータが安全に分離され、意図しないコードの実行を防ぐことができます。この関数は、特定のファイル形式へデータを書き込むなど、ごく限定的な用途でのみ利用を検討してください。