[php] date()とstrtotime()で日時を取得する
スポンサーリンク
phpで相対的な日時を得る方法のメモ。昨日明日、先月来月、次の日曜前の日曜、3分前、10分後など、現在日時を起点にしたあらゆるパターンの日時が得られる。
strtotime()
はUnixタイムスタンプを返す組み込み関数。日時の文字列を渡すとそれに応じたUNIXタイムスタンプを返してくれる。
strtotime( "1999-12-31 23:59:59" );//946652399
で、strtotime()
は日時以外に、様々な相対日時を指定可能になっている。strtotime( "yesterday" )
とやると前日の午前0時0分0秒のUNIXタイムスタンプが返ってくる。これをdate()
関数と組み合わせて使うことで、相対日時を簡単に取得することができる。
date( "Y-m-d H:i:s" , strtotime( "yesterday" ) );//ex 2011-10-27 00:00:00
以下はstrtotime()
で使える日時指定のリスト。
現在日時
strtotime( "now" );
昨日明日、一昨日、明後日など前後の日付
strtotime( "+1 day" );//明日 strtotime( "+2 day" );//明後日 strtotime( "+10 day" );//10日後 strtotime( "+365 day" );//365日後 strtotime( "1 day" );//+は省いても構わない strtotime( "-1 day" );//昨日 strtotime( "-2 day" );//一昨日 strtotime( "-10 day" );//10日前 strtotime( "-365 day" );//365日前
昨日今日明日の0時0分0秒
strtotime( "today" );//今日の0時0分0秒 strtotime( "yesterday" );//昨日の0時0分0秒 strtotime( "tomorrow" );//明日の0時0分0秒 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" )
で今日が始まって何秒経過したとかできて便利。
正午
strtotime( "noon" );//今日の12時0分0秒 strtotime( "yesterday noon" );//昨日正午
週
strtotime( "+1 week" );//1週間後 strtotime( "+10 week" );//10週後 strtotime( "-1 week" );//1週間前 strtotime( "-10 week" );//10週前
月
strtotime( "+1 month" );//来月1日の0時0分0秒。 strtotime( "+2 month" );//再来月1日の0時0分0秒。 strtotime( "-1 month" );//先月1日の0時0分0秒。 strtotime( "-2 month" );//2カ月前1日の0時0分0秒。 strtotime( "2013-07" );//2013年7月1日0時0分0秒。 strtotime( "january" );//今日が28日だとすると、今年の1月28日の0時0分0秒。 strtotime( "2013-08-01 +1 month" );//2013年9月1日の0時0分0秒 strtotime( "2013-08-31 +1 month" );//2013年10月1日の0時0分0秒になってしまう! 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に変換しているようなのだ。よって、月送りには日付を指定せずに使うのが良い。
月初・月末
strtotime( "first day of 2013-07-10" );//2013年7月1日0時0分0秒。 strtotime( "first day of january" );//first dayは年を省き月だけの指定も可能。この場合は今年の1月1日0時0分0秒。 strtotime( "first day of 2013-07" );//これでもOK strtotime( "last day of 2013-07-01" );//2013年7月31日の0時0分0秒。 strtotime( "last day of january" );//今年の1月31日0時0分0秒。 strtotime( "last day of 2013-07" );//2013年7月31日の0時0分0秒。 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にすると、前の月の末日が得られる。
年
strtotime( "+1 year" );//現在日時の1年後. 今が2014年1月1日10時ちょうどなら返り値は'2015-01-01 10:00:00' strtotime( "-1 year" );//現在日時の1年前. 今が2014年1月1日10時ちょうどなら返り値は'2013-01-01 10:00:00' strtotime( "last year" );// "-1 year"と同じ strtotime( "next year" );// "+1 year"と同じ //特定の時刻が得たいなら以下の書き方が可能 strtotime( "+1 year 00:00:00" );//現在日時の1年後の0時0分0秒になる01-01 10:00:00'
曜日
strtotime( "next sunday" );//次の日曜の0時0分0秒 strtotime( "+2 sunday" );//次の次の日曜0時0分0秒 strtotime( "last sunday" );//前の日曜の0時0分0秒 strtotime( "-3 sunday" );//3回前の日曜0時0分0秒 strtotime( "next sun" );//略称でもOK strtotime( "first sun of 2011-10" );//指定した月の最初の日曜の日付。時間は0時0分0秒 strtotime( "second sun of 2011-10" );//指定した月の2つめの日曜の日付 strtotime( "last sun of 2011-10" );//指定した月の最後の日曜の日付 strtotime( "first sun of october 2011" );//この書き方でもOK
時分秒
strtotime( "+5 sec" );//5秒後 strtotime( "+5 min" );//5分後 strtotime( "+1 hour" );//1時間後 strtotime( "-5 sec" );//5秒前 strtotime( "-5 min" );//5分前 strtotime( "-1 hour" );//1時間前 strtotime( "+5 second" );//秒はsec・secondどちらでも可 strtotime( "+5 minute" );//分もmin・minuteどちらも可
組み合わせ
strtotime( "+1 month +1 day +1 hour +1 minute" );//1カ月と1日と1時間1分後
スポンサーリンク