php で○時間前、○日前など

phpで相対的な日時を得る方法のメモ。昨日明日、先月来月、次の日曜前の日曜、3分前、10分後など、現在日時を起点にしたあらゆるパターンの日時が得られる。

strtotime()はUnixタイムスタンプを返す組み込み関数。日時の文字列を渡すとそれに応じたUNIXタイムスタンプを返してくれる。

  1. strtotime(“1999-12-31 23:59:59”);//946652399

で、strtotime()は日時以外に、様々な相対日時を指定可能になっている。strtotime( "yesterday" )とやると前日の午前0時0分0秒のUNIXタイムスタンプが返ってくる。これをdate()関数と組み合わせて使うことで、相対日時を簡単に取得することができる。

  1. date(“Y-m-d H:i:s”, strtotime(“yesterday”));//ex 2011-10-27 00:00:00

以下はstrtotime()で使える日時指定のリスト。

現在日時

  1. strtotime(“now”);

昨日明日、一昨日、明後日など前後の日付

  1. strtotime(“+1 day”);//明日
  2. strtotime(“+2 day”);//明後日
  3. strtotime(“+10 day”);//10日後
  4. strtotime(“+365 day”);//365日後
  5.  
  6. strtotime(“1 day”);//+は省いても構わない
  7.  
  8. strtotime(“-1 day”);//昨日
  9. strtotime(“-2 day”);//一昨日
  10. strtotime(“-10 day”);//10日前
  11. strtotime(“-365 day”);//365日前

昨日今日明日の0時0分0秒

  1. strtotime(“today”);//今日の0時0分0秒
  2. strtotime(“yesterday”);//昨日の0時0分0秒
  3. strtotime(“tomorrow”);//明日の0時0分0秒
  4.  
  5. strtotime(“yesterday 15:00:00”);//昨日の15時0分0秒

strtotime( "+1 day" )が現在時のちょうど24時間後になるのに対し、strtotime( "tomorrow" )だと明日の0時0分0秒が得られる。たまにstrtotime( "tomorrow" )strtotime( "+1 day" )は同じと書いているのを見かけるが間違い。異なった数値が返ってくるので使い分ける。 strtotime( "now" ) - strtotime( "today" )で今日が始まって何秒経過したとかできて便利。

正午

  1. strtotime("noon");//今日の12時0分0秒
  2.  
  3. strtotime("yesterday noon");//昨日正午

  1. strtotime("+1 week");//1週間後
  2. strtotime("+10 week");//10週後
  3. strtotime("-1 week");//1週間前
  4. strtotime("-10 week");//10週前

  1. strtotime("+1 month");//来月1日の0時0分0秒。
  2. strtotime("+2 month");//再来月1日の0時0分0秒。
  3. strtotime("-1 month");//先月1日の0時0分0秒。
  4. strtotime("-2 month");//2カ月前1日の0時0分0秒。
  5.  
  6. strtotime("2013-07");//2013年7月1日0時0分0秒。
  7. strtotime("january");//今日が28日だとすると、今年の1月28日の0時0分0秒。
  8.  
  9. strtotime("2013-08-01 +1 month");//2013年9月1日の0時0分0秒
  10. strtotime("2013-08-31 +1 month");//2013年10月1日の0時0分0秒になってしまう!
  11. strtotime("2013-08 +1 month");//2013年9月1日の0時0分0秒

日を指定せず、YYYY-MMを与えるとその月の1日になり、Januaryのように英語月名を与えると今日の日付になる。

+1 monthを使う時は、日付まで指定して使うと予想外の値になる場合がある。例えば、strtotime( "2013-08-31 +1 month" )とすると、返ってくる値は2013-09-30ではなく2013-10-01である。strtotime( "2013-08-30 +1 month" )なら2013-09-30になる。どうやら+1 monthは、単純に月に1を足しているだけのもよう。つまり、2013-08-31という値を+1 monthすると、まず2013-09-31という文字列を作成し、次いでこれを2013-10-01に変換しているようなのだ。よって、月送りには日付を指定せずに使うのが良い。

月初・月末

  1. strtotime("first day of 2013-07-10");//2013年7月1日0時0分0秒。
  2. strtotime("
    first day of january"
    );//first dayは年を省き月だけの指定も可能。この場合は今年の1月1日0時0分0秒。
  3. strtotime("first day of 2013-07");//これでもOK
  4.  
  5. strtotime("last day of 2013-07-01");//2013年7月31日の0時0分0秒。
  6. strtotime("last day of january");//今年の1月31日0時0分0秒。
  7. strtotime("last day of 2013-07");//2013年7月31日の0時0分0秒。
  8.  
  9. strtotime("first day of next month");//来月1日0時0分0秒。

月末日は月によってバラバラなので、last day ofは非常に便利。「月」の項目でも説明したが、strtotime("2013-08-31 +1 month")は10月1日になってしまう。2013年8月の翌月の末日を得たい場合は、strtotime( "last day of 2013-08 +1 month" )とする。これで2013-09-30が得られる。

ただし、PHPのバージョンによっては(5.4.4以前?)、first day ofとlast day ofは動かない。確実に月初や月末を得たい場合はmktime()を使う方が良い。mktime()の第5引数を0にすると、前の月の末日が得られる。

  1. strtotime("+1 year");//現在日時の1年後. 今が2014年1月1日10時ちょうどなら返り値は'2015-01-01 10:00:00'
  2. strtotime("-1 year");//現在日時の1年前. 今が2014年1月1日10時ちょうどなら返り値は'2013-01-01 10:00:00'
  3.  
  4. strtotime("last year");// "-1 year"と同じ
  5. strtotime("next year");// "+1 year"と同じ
  6.  
  7. //特定の時刻が得たいなら以下の書き方が可能
  8. strtotime("+1 year 00:00:00");//現在日時の1年後の0時0分0秒になる01-01 10:00:00'

曜日

  1. strtotime("next sunday");//次の日曜の0時0分0秒
  2. strtotime("+2 sunday");//次の次の日曜0時0分0秒
  3. strtotime("last sunday");//前の日曜の0時0分0秒
  4. strtotime("-3 sunday");//3回前の日曜0時0分0秒
  5.  
  6. strtotime("next sun");//略称でもOK
  7.  
  8. strtotime("first sun of 2011-10"
    );//指定した月の最初の日曜の日付。時間は0時0分0秒
  9. strtotime("second sun of 2011-10");//指定した月の2つめの日曜の日付
  10. strtotime("last sun of 2011-10"));//指定した月の最後の日曜の日付
  11. strtotime("first sun of october 2011");//この書き方でもOK

時分秒

  1. strtotime("+5 sec");//5秒後
  2. strtotime("+5 min");//5分後
  3. strtotime("+1 hour");//1時間後
  4. strtotime("-5 sec");//5秒前
  5. strtotime("-5 min");//5分前
  6. strtotime("-1 hour");//1時間前
  7.  
  8. strtotime("+5 second");//秒はsec・secondどちらでも可
  9. strtotime("+5 minute");//分もmin・minuteどちらも可

組み合わせ

  1. strtotime("+1 month +1 day +1 hour +1 minute");//1カ月と1日と1時間1分後

季節で表示を変ええる

date関数で月日を4桁数字として取得する。
季節の月日と比較するだけ。

春  3月1日– 5月31日
夏  6月1日– 8月31日
秋  9月1日–11月31日
冬 12月1日–2月29日

<?php
    // 今日の月日を取得
    $date = date(md);
    // 春
    if( ($date >= 0310) && ($date <= 0531) ){
        $tab_active = 'Spring';
    // 夏
    }elseif( ($date >= 0601) && ($date <= 0831) ){
        $tab_active = 'Summer';
    // 秋
    }elseif( ($date >= 0901) && ($date <= 1131) ){
        $tab_active = 'Autumn';
    // 冬
    }elseif( ($date >= 1201) || ($date <= 0229) ){
        $tab_active = 'Winter';
    }
?>