指定日の翌日とかのソレ。
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(日付)のフォーマット一覧 [年/月/日/時/分/秒/曜日]