[PHP] DateTimeで月末・月初とか相対的な日付を取得

2019-04-08PHP

昨日・明日、月末・月初、年末などを、「tomorrow」、「last day of」のような名前で指定した日付を取得する方法
strtotime() でも同じ名前で、同じように取得できるが、 DateTime の使用が推奨されている

使い方

$date = new DateTime('日付文字列');

日付文字列には、ある時点から見ていつ(相対的)なのかを表す英語名が入る

「ある時点」には現時点と、任意の時を指定できる場合がある

処理の順番は、相対的でない値(「 11:00 」とか実際の時間を表す表記)が先、相対的な日付文字列は後になるが、以下の日付文字列は例外。
"tomorrow""yesterday""midnight""today""noon"

("tomorrow 任意の時刻")とすると、結果は 「明日の任意の時刻」となるが、("任意の時刻 tomorrow")とすると、結果は 「明日の 00:00:00 」となり任意の時刻が処理されない
詳細は「明日」の項を参照

明日


// now 2019-04-07 22:35:25
// 明日の 00:00:00
$tmrw = new DateTime('tommorow');
echo $tmrw->format('Y-m-d H:i:s');	// 2019-04-08 00:00:00
// 明日の 10:00:00
$tmrw2 = new DateTime('tommorow 10:00');
echo $tmrw2->format('Y-m-d H:i:s');	// 2019-04-08 10:00:00
// 明日の 00:00:00となる(10:00:00ではない)
$tmrw3 = new DateTime('10:00 tommorow');
echo $tmrw3->format('Y-m-d H:i:s');	// 2019-04-08 00:00:00

昨日


// now 2019-04-07 22:37:08
// 昨日の 00:00:00
$yesterday = new DateTime('yesterday');
echo $yesterday->format('Y-m-d H:i:s');	// 2019-04-06 00:00:00
// 昨日の 10:00:00
$yesterday1 = new DateTime('yesterday 10:00');
echo $yesterday1->format('Y-m-d H:i:s');	// 2019-04-06 10:00:00
// 昨日の 00:00:00となる(10:00:00ではない)
$yesterday2 = new DateTime('10:00 yesterday');
echo $yesterday2->format('Y-m-d H:i:s');	// 2019-04-06 00:00:00

月末

// now 2019-04-07 22:38:32
// 今月末
$end = new DateTime('last day of this month');
echo $end->format('Y-m-d H:i:s');	// 2019-04-30 22:38:32
// 来月末
$nextend = new DateTime('last day of next month');
echo $nextend->format('Y-m-d H:i:s');	// 2019-05-31 22:38:32
// 任意の月末
$anyend = new DateTime('last day of 2020-04');
echo $anyend->format('Y-m-d H:i:s');	// 2020-04-30 00:00:00
// * 年月を「202004」とすると正しく処理されない
// 任意の月末の特定の曜日
$anyday = new DateTime('last fri of june 2019');
echo $anyday->format('Y-m-d H:i:s');	// 2019-06-28 00:00:00

月初


// now 2019-04-07 22:43:07
// 今月初
$end = new DateTime('first day of this month');
echo $end->format('Y-m-d H:i:s');	// 2019-04-01 22:43:07
// 来月初
$nextend = new DateTime('first day of next month');
echo $nextend->format('Y-m-d H:i:s');	// 2019-05-01 22:43:07
// 任意の月初
$anyend = new DateTime('first day of 2020-04');
echo $anyend->format('Y-m-d H:i:s');	// 2020-04-01 00:00:00
* 年月を「202004」とすると正しく処理されない

年末


// now 2019-04-07 22:51:31
// 今年の年末
$end = new DateTime('last day of december');
echo $end->format('Y-m-d H:i:s');	// 2019-12-31 00:00:00
// 任意の年末
$end2 = new DateTime('last day of 23:00 december 2021');
echo $end2->format('Y-m-d H:i:s');	// 2021-12-31 23:00:00

相対的な日付文字列一覧

公式ドキュメント 相対的な書式
日付に基づいた表記
書式 説明
'yesterday' 昨日の00:00:00 "yesterday 14:00"
'midnight' 時刻を00:00:00にします  
'today' 明日の00:00:00にします  
'now' 現在  
'noon' 時刻を12:00:00にします "yesterday noon"
'tomorrow' 明日の00:00:00  
'back of' hour 指定された時の15分後 "back of 7pm", "back of 15"
'front of' hour 指定された時の15分前 "front of 5am", "front of 23"
'first day of' 現在月の最初の日にします。 この書式に続けて月名を指定する使いかたが最適です。 "first day of January 2008"
'last day of' 現在月の最後の日にします。 この書式に続いて月名を指定する使いかたが最適です。 "last day of next month"
ordinal space dayname space 'of' 現在月のx番目の曜日を計算します。 "first sat of July 2008"
'last' space dayname space 'of' 現在月の 最後の 曜日を計算します。 "last sat of July 2008"
number space? (unit | 'week') 値を数値で指定するような、相対的な時間指定を処理します。 "+5 weeks", "12 day", "-7 weekdays"
ordinal space unit 値を英単語で指定するような、相対的な時間指定を処理します。 "fifth day", "second month"
'ago' 直前に指定された相対的な時間指定について、正負反転します。 "2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago"
dayname 現在からみて次にやってくる、指定された曜日にします。 "Monday"
reltext space 'week' 特別な書式 "weekday + last/this/next week" を処理します。 "Monday next week"

Posted by Agopeanuts