[PHP] 指定日から”+1 day”とか [strtotime]

この記事は約6分で読めます。
スポンサーリンク

当サイトには広告が含まれています。

指定日の翌日とかのソレ。

date_default_timezone_set('Asia/Tokyo') ;

$jst = "2022-01-01 00:00:00" ;

// 正解(後方はカンマ)
$gmt_001 = date("Y-m-d H:i:s",strtotime("-2 hour",strtotime($jst))) ;

↑strtotimeの第二引数はUnixタイムスタンプなンで、コルェが本来のカタチだが、strtotimeが二重なンがスッキリせン/賎ので却下!

なので、ダブルクォーテーションの中に、スペースで区切ッて入れる。

// 正解
$gmt_002 = date("Y-m-d H:i:s",strtotime("-2 hour $jst")) ;

以下のように、逆でもOK。

// 正解
$gmt_003 = date("Y-m-d H:i:s",strtotime("$jst -2 hour")) ;

なお、以下のようにシングルクォーテーションで囲ンぢマウと、

$gmt_008 = date("Y-m-d H:i:s",strtotime('-2 hour $jst')) ;

変数が展開されヅ、「1970-01-01 00:00:00」となッてアウト!

なお、スペースがなくてもOK。

// 正解
$gmt_004 = date("Y-m-d H:i:s",strtotime("-2hour$jst")) ;
// 正解
$gmt_005 = date("Y-m-d H:i:s",strtotime("$jst-2hour")) ;

さらに、スペースがナゐ状態で直接ヴッ込ンでもOK。

// 正解
$gmt_006 = date("Y-m-d H:i:s",strtotime("-2hour2022-01-0100:00:00")) ;
// 正解
$gmt_007 = date("Y-m-d H:i:s",strtotime("2022-01-0100:00:00-2hour")) ;

変数をダブルクォーテーションの中に入れたくナゐ(クィムォティ惡ゐ)!とゆぅ場合は、以下のようにドットで結合シタレ!

// 正解
$gmt_009 = date("Y-m-d H:i:s",strtotime("-2 hour".$jst)) ;
// 正解
$gmt_010 = date("Y-m-d H:i:s",strtotime($jst."-2 hour")) ;

ゐ々加減に書ゐても多少は問題ナゐHTMLじゃ/邪NINE/ナゐンだから、こンな様々なアレで通るのは、正直どうなン?

なお、検索/健作の上位に表示される以下は誤りなので要注意/妖虫遺!

// 誤り
$gmt_011 = date("Y-m-d H:i:s",$jst.strtotime("-9 hour")) ;

妖虫

ナニが「サクッと」邪!スィヌェ!ドァヴォ!!

±month(月)の場合の注意

同様に”-1 month”(1ヶ月前)や”+1 month”(1ヶ月後)も指定できるが、

$day = "2023-03-31" ;
print date("Y-m-d",strtotime("-1 month".$day)) ;

で、何が出るか?

「2023-03-03」

ゑ?

2/二/貳月/February/如月じゃなゐン?

てコトだが、2023年2月は28日までしかないので、”2023-03-31″の”-1 month”、つまり”2023-02-31″は、

・2023-02-28
・2023-02-29 → 2023-03-01
・2023-02-30 → 2023-03-02
2023-02-31 → 2023-03-03

となるのね。

要は、単純に「月の引き算」「月の足し算」をしているだけ!

てコトは、閏年(うるうどし)である2024年の場合だと、

$day = "2024-03-31" ;
print date("Y-m-d",strtotime("-1 month".$day)) ;

・2024-02-28
・2024-02-29
・2024-02-30 → 2024-03-01
2024-02-31 → 2024-03-02

よって「2024-03-02」となる。

なお、変数に存在しない日を入れても、エラーにはならない。

$day = "2023-02-30" ; ← 存在しない日
print date("Y-m-d",strtotime("-1 month".$day)) ;

結果「2023-02-02」

“2023-02-30″は、以下のように”2023-03-02″であるから、

・2023-02-28
・2023-02-29 → 2023-03-01
2023-02-30 → 2023-03-02

その1ヶ月前てコトで「2023-02-02」となる。

このように、エラーにはならヅ、ぢッくり考ゑルと理解できる日を返すのであるが…

ソムォ々、存在しナゐ日を扱うとゆぅコト自体が異常!とゆぅ場合は、checkdateで日付の妥当性をチェックすべきだ。

checkdate(月,日,年) ; ← 引数の順序に注意(年,月,日ではない)

閏年(うるうどし)の場合は、それも考慮して判別(true/false)してくれる。

$day = "2023-01-01" ;

list($y,$m,$d) = explode('-',$day) ;

if(checkdate($m,$d,$y) === true){
print "存在する日" ;
}else{
print "ンな日はナゐ" ;
}//if

結果「存在する日」

$day = "2023-02-29" ; ← 存在しない日
結果「ンな日はナゐ」

$day = "2024-02-29" ; ← 閏年(うるうどし)
結果「存在する日」

年月日の各々の頭に「0」が付いていても処理してくれるので、取る必要はない。

但し、直接ヴッ込む場合は、クォーテーションで囲ッて文字列扱ゐにしないと、値によっては「Invalid numeric literal」でエラーとなる。

if(checkdate(08,08,2023) === true) {
// 何らかの処理
}//if

結果「PHP Parse error: Invalid numeric literal in …」

・01:エラーなし
・02:エラーなし
・03:エラーなし
・04:エラーなし
・05:エラーなし
・06:エラーなし
・07:エラーなし
・08:Invalid numeric literal
・09:Invalid numeric literal
・10:エラーなし

頭に0を付けた場合、8進数を表すコトになるが、8進数は0-7までの数字で表すので、8や9が出るとアウトとなるタメだ。

各々をクォーテーションで囲ゐ、文字列扱ゐにすればOK。

if (checkdate("08","08","2023") === true) {
// 何らかの処理
}//if

01-07までは問題なく、08でイキナリERRORになるンで、「なンで?」と混乱シガチかはシラン(SILANE)。

関連:指定日から動かしていく場合

if(date('L',strtotime('2022-01-01'))){ (年だけでなく年月日を入れないとダメ)
$all = "366" ;// 閏年(うるうどし)
}else{
$all = "365" ;// 平年
}//if

dateの「L」で閏年判断が可能。閏年なら「1」、平年なら「0」を返す。

for($i=0;$i=$all-1;$i++){
$day = "2022-12-31" ;
$move = "-".$i." day" ; (「-$i day」を文字列結合で作っておく)
$day = date("Y-m-d",strtotime($day.$move)) ; (後方はカンマではなくドット)
}//for

関連:[PHP] date(日付)のフォーマット一覧 [年/月/日/時/分/秒/曜日]

タイトルとURLをコピーしました