【PHP】指定時間前や指定時間後の日時を求める

公開日:
更新日:
カテゴリー: PHP

PHPで日時(現在日時もしくは指定日時)から

  • 指定時間前:○秒前、○分前、○時間前、○日前、○週間前、○ヶ月前、○年前
  • 指定時間後:○秒後、○分後、○時間後、○日後、○週間後、○ヶ月後、○年後

を求める方法をまとめています。

date関数とstrtotime関数を使う

ある日時から指定時間前および指定時間後を求める場合、date関数とstrtotime関数を使います。

date関数

date関数は、日付・時刻を書式化する関数です。

date(フォーマット, タイムスタンプ);

第2引数にタイムスタンプ(UNIXタイムスタンプ)を指定すると、それを第1引数で指定したフォーマット(日付・時刻)に変換してくれます(失敗した場合は「false」が返される)。

第2引数を省略した場合、現在のタイムスタンプ(time関数)が使われます。

指定できるフォーマットやdate関数の詳細はこちらを参照して下さい。

strtotime関数

strtotime関数は、英文形式の日付をUNIXタイムスタンプに変換する関数です。

strtotime(英文形式の日付);

引数に英文形式の日付を指定すると、それをUNIXタイムスタンプに変換してくれます(失敗時は「false」が返されます)。

なお、使用できる英文書式や、第2引数も指定できますので、strtotime関数の詳細はこちらを参照して下さい。

現在日時から指定時間前を求める

現在日時から指定時間前を求めるスクリプトを掲載したいと思います。

なお、単位は全て「1」にしています。

<?php
//○秒前
echo date("Y-m-d H:i:s",strtotime("-1 second"));
//○分前
echo  date("Y-m-d H:i:s",strtotime("-1 minute"));
//○時間前
echo date("Y-m-d H:i:s",strtotime("-1 hour"));
//○日前
echo date("Y-m-d H:i:s",strtotime("-1 day"));
//○週間前
echo date("Y-m-d H:i:s",strtotime("-1 week"));
//○ヶ月前
echo date("Y-m-d H:i:s",strtotime("-1 month"));
//○年前
echo date("Y-m-d H:i:s",strtotime("-1 year"));
?>

現在日時から指定時間後を求める

現在日時から指定時間後を求めるスクリプトを掲載したいと思います。

なお、単位は全て「1」にしています。

<?php
//○秒後
echo date("Y-m-d H:i:s",strtotime("+1 second"));
//○分後
echo  date("Y-m-d H:i:s",strtotime("+1 minute"));
//○時間後
echo date("Y-m-d H:i:s",strtotime("+1 hour"));
//○日後
echo date("Y-m-d H:i:s",strtotime("+1 day"));
//○週間後
echo date("Y-m-d H:i:s",strtotime("+1 week"));
//○ヶ月後
echo date("Y-m-d H:i:s",strtotime("+1 month"));
//○年後
echo date("Y-m-d H:i:s",strtotime("+1 year"));
?>

指定日時から指定時間前を求める

指定日時(ここでは2014-05-28 07:02:54)から指定時間前を求めるスクリプトを掲載したいと思います。

なお、単位は全て「1」にしています。

<?php
//指定日時
$target_day = "2014-05-28 07:02:54";

//○秒前
echo date("Y-m-d H:i:s",strtotime($target_day . "-1 second"));
//○分前
echo  date("Y-m-d H:i:s",strtotime($target_day . "-1 minute"));
//○時間前
echo date("Y-m-d H:i:s",strtotime($target_day . "-1 hour"));
//○日前
echo date("Y-m-d H:i:s",strtotime($target_day . "-1 day"));
//○週間前
echo date("Y-m-d H:i:s",strtotime($target_day . "-1 week"));
//○ヶ月前
echo date("Y-m-d H:i:s",strtotime($target_day . "-1 month"));
//○年前
echo date("Y-m-d H:i:s",strtotime($target_day . "-1 year"));
?>

指定日時から指定時間後を求める

指定日時(ここでは2014-05-28 07:02:54)から指定時間後を求めるスクリプトを掲載したいと思います。

なお、単位は全て「1」にしています。

<?php
//指定日時
$target_day = "2014-05-28 07:02:54";

//○秒後
echo date("Y-m-d H:i:s",strtotime($target_day . "+1 second"));
//○分後
echo  date("Y-m-d H:i:s",strtotime($target_day . "+1 minute"));
//○時間後
echo date("Y-m-d H:i:s",strtotime($target_day . "+1 hour"));
//○日後
echo date("Y-m-d H:i:s",strtotime($target_day . "+1 day"));
//○週間後
echo date("Y-m-d H:i:s",strtotime($target_day . "+1 week"));
//○ヶ月後
echo date("Y-m-d H:i:s",strtotime($target_day . "+1 month"));
//○年後
echo date("Y-m-d H:i:s",strtotime($target_day . "+1 year"));
?>

注意

この方法を利用して○ヶ月前や○ヶ月後の日時を求める場合、注意が必要です。

それは、strtotime関数は単純に「月の引き算」「月の足し算」をしているだけだからです。

例えば、次のように「2014-03-31」の1ヶ月前を求めると、「2014-03-03」となります。

<?php
//指定日時
$target_day = "2014-03-31";
//1ヶ月前の日時を取得
echo date("Y-m-d",strtotime($target_day . "-1 month"));
?>

出力結果:2014-03-03

【原因】
strtotime関数は「2014-03-31」の1ヶ月前を「2014-02-31」と計算する。
2月は28日までなので、超過している日数を翌月に繰り越して「2014-03-03」となる。

また、同様に「2014-08-31」の1ヶ月後を求めると、「2014-10-01」となります。

<?php
//指定日時
$target_day = "2014-08-31";
//1ヶ月後の日時を取得
echo date("Y-m-d",strtotime($target_day . "+1 month"));
?>

出力結果:2014-10-01

【原因】
strtotime関数は「2014-08-31」の1ヶ月後を「2014-09-31」と計算する。
9月は30日までなので、超過している日数を翌月に繰り越して「2014-10-01」となる。

また、閏年の場合、「2016-02-29」の○年前や○年後を求めると、同様な理由で「03-01」となります。

<?php
//指定日時
$target_day = "2016-02-29";
//1年前の日時を取得
echo date("Y-m-d",strtotime($target_day . "-1 year"));
//1年後の日時を取得
echo date("Y-m-d",strtotime($target_day . "+1 year"));
?>

出力結果:2015-03-01 2017-03-01

このように、月によって28日であったり30日であったり31日であったり、平年や閏年の違いがあったりで、○ヶ月前&○ヶ月後、○年前&○年後の日時を取得する場合、正確な日時を取得できない場合があります。

 

頑張って書いたのでちょろっと読んでほしい!

 

コメント

1:sleep:2016/03/28 10:34:36

&gt; 指定日時から指定時間前を求める
探してた情報そのまま活用できました!ありがとうございます!

コメントフォーム
お名前
コメント