最終更新日:
公開日:
レシピ
日付・時刻
日付の計算:strtotime関数
strtotime関数を使って、「xx日前の日付」「xxヶ月後の日付」「今年の年末の曜日」などの日付を計算する方法について解説します。
この記事のポイント
- 「日」「月」「年」などの単位で時間を計算する
- 月末の時間を計算する
- 年末の時間を計算する
目次
strtotime関数を使って時間を計算する
「3日後の日付を取得したい」「今月末が何曜日か知りたい」など、時刻を扱う上では様々な計算が必要になります。
そこで今回は、strtotime関数を使った非常に便利な日付の計算方法を解説します。
今回は次のように「日」単位、「週」単位、「月」単位の基本的な日付について解説したうえで、曜日や年末などの日付を取得する方法もご紹介します。
- 「xx日前」「xx日後」を取得する
- 「xx週間前」「xx週間後」を取得する
- 「xxヶ月前」「xxヶ月後」を取得する
- 次のxx曜日を取得する
- 月末の日時・曜日を取得する
- 年末の日時・曜日を取得する
これらは全て、strtotime関数を使って取得することができます。
1つずつ取得するコードを確認していきましょう。
「日」単位で時間を計算する
「xx日前」「xx日後」など、「日」の単位でずらした日付を取得したいときは、次のようなコードになります。
コード例
<?php
// 仮に2017年8月1日の日付を基準にするとします
$date = '2017-08-01 16:30:00';
// 1日前の日付を取得
$timestamp = strtotime('-1 day ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-07-31 16:30:00
// 5日前の日付を取得
$timestamp = strtotime('-5 day ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-07-27 16:30:00
// 3日後の日付を取得
$timestamp = strtotime('+3 day ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-08-04 16:30:00
// 100日後の日付を取得
$timestamp = strtotime('+100 day ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-11-09 16:30:00
strtotime関数は文字列型の日付を渡すとタイムスタンプを取得することができますが、上記のように日付の前に「-1 day」と指定することで、xx日後やxx日前の日付を取得することができます。
出力結果から、「月」や「年」もしっかり切り替わっていることがわかります。
「日」と同じように、「月」であれば「month」、「年」であれば「year」に変えるだけで、それぞれの単位に合わせた日付の移動が可能です。
非常に便利。
エラーにはなりませんが、コードが読みづらくなってしまうため「day」の前後に空白スペースを入れることをオススメします。
「週」単位で時間を計算する
「日」と同じような方法で、「xx週間前」「xx週間後」といった「週」単位の計算を行います。
コード例
<?php
// 2017年8月1日の日付を基準にする
$date = '2017-08-01 16:30:00';
// 1週間前の日付を取得
$timestamp = strtotime('-1 week ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-07-25 16:30:00
// 4週間前の日付を取得
$timestamp = strtotime('-4 week ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-07-04 16:30:00
// 1週間後の日付を取得
$timestamp = strtotime('+1 week ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-08-08 16:30:00
// 4週間後の日付を取得
$timestamp = strtotime('+4 week ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-08-29 16:30:00
「月」単位で時間を計算する
「xxヶ月前」「xxヶ月後」といった「月」単位の計算を行います。
コード例
<?php
// 2017年8月1日の日付を基準にする
$date = '2017-08-01 16:30:00';
// 1ヶ月前の日付を取得
$timestamp = strtotime('-1 month ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-07-01 16:30:00
// 5ヶ月前の日付を取得
$timestamp = strtotime('-5 month ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-03-01 16:30:00
// 1ヶ月後の日付を取得
$timestamp = strtotime('+1 month ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-09-01 16:30:00
// 6ヶ月後の日付を取得
$timestamp = strtotime('+6 month ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2018-02-01 16:30:00
同様に、「month」を、「year」に変更すると「年」単位の計算をすることもできます。
次のxx曜日を取得する
続いて、少し変則的ですが「次の日曜日は何日?」といった日付の計算を実行してみます。
コード例
<?php
// 2017年8月1日の日付を基準にする
$date = '2017-08-01 16:30:00';
// 次の「日曜」の日付を取得
$timestamp = strtotime('next sunday ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-08-06 16:30:00
// 次の「日曜」の日付を取得 ※先頭3文字でも取得可
$timestamp = strtotime('next sun ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-08-06 16:30:00
// 次の次の「日曜」の日付を取得
$timestamp = strtotime('+2 sun ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-08-13 16:30:00
月末の日時・曜日を取得する
続いて、月末の日付と曜日を取得してみます。
コード例
<?php
// 2017年8月1日の日付を基準にする
$date = '2017-08-01 16:30:00';
// 2017年8月末の日付を取得
$timestamp = strtotime('last day of ' . $date);
echo date("Y-m-d H:i:s", $timestamp); // 2017-08-31 16:30:00
echo date("l", $timestamp); // Thursday
「last day of 」+日付と少し長くなっていますが、この記述でタイムスタンプの月の末日を取得することができます。
年末の日時・曜日を取得する
最後に、年末のタイムスタンプを取得してみます。
年末の日付は必ず「12月31日」となるため、実際に変動するのは「年」のみです。
そのため、年だけを
コード例
<?php
// 2017年8月1日の日付を基準にする
$date = '2017-08-01 16:30:00';
// 2017年の末日を取得
$timestamp = strtotime('last day of ' . date("Y-12-31", strtotime($date)));
echo date("Y-m-d H:i:s", $timestamp); // 2017-12-31 00:00:00
echo date("l", $timestamp); // Sunday
strtotime関数の中で、strtotime関数を呼び出しています。
そこでまずタイムスタンプを生成し、date関数で年末の日付を作成しています。
そして、その日付と「last day of」を組み合わせることで、最終的に年末のタイムスタンプを作成しています。
出力された結果から、2017年12月31日は「日曜」であることが分かりました。
以上、strtotime関数を使った日付の計算方法でした。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。