date()とdate_format()
パラメータの型が違う点がありますが「日付が2022年の値」なら、どちらも「2022」を返します。
date(‘Y’, strtotime(日付) )
date_format(日付, ‘Y’)
なぜこだわるのか?と言いますと
変更前
$w_date = date_create(日付);
if ( $kotoshi == date(‘Y’, strtotime(日付) ) ){
$wk_ymd = date_format($w_date, ‘n月j日’);
…
変更後
$w_date = date_create(日付);
if ( $kotoshi == date_format($w_date, ‘Y’) ) {
$wk_ymd = date_format($w_date, ‘n月j日’);
…
と、strtotimeの処理を省くことができるからです
Q.日付けの引き算
A.一例として
現在日付時刻から、 MySQLのテーブルの日付時刻型を引く場合
while ($row = $stmt->fetch()) {
$w_diff = strtotime(date('c')) - strtotime($row['tsuika_time']);
echo $w_diff .'秒'."\n";
}
→ 結果が「秒」で算出されます。
Q.単純に今日は?
A.
date('Y/n/j'); 設定できる書式。
例. 2022/2/2の時 date(“n月j日現在”) → 2月2日現在
また現在のUnixタイムスタンプを知りたい時は time()
サンプル 今日と同じ日のデータは?
if (date('Y/n/j', strtotime($clus_day)) == date('Y/n/j')){
※もし、データ中の日付==今日 と一致したら
Q.昨日は?
A. strtotime(‘-1 day’);
使用例
date("Y/n/j時点", strtotime('-1 day'));
単に「前日の日付を表示させる場合」なら、問題ない。
しかし
if (strtotime($clus_day) == strtotime(‘-1 day’)) {
の比較は要注意で、不一致になる可能性があり、考えられる理由は「日付は同じだが、時刻が異なる」という判定になると思わます。
結局、「書式で日付だけに変更し、それを比較する処理」に変更した方がだと思います。
if (date('Y/n/j', strtotime($clus_day)) == date('Y/n/j', strtotime('-1 day'))){
サンプル 2日前と同じ年月なら
if (date('Y/m', strtotime($clus_day)) == date('Y/m', strtotime('-2 day'))){
Q. 例 2021-09-25T19:46:31+09:00 形式の日付を出したい
A. DATE_ATOM や date(‘c’)。ISO8601の日付らしい(c について)
なお使い方は
date_default_timezone_set(‘Asia/Tokyo’);
date(‘c’)
の順に記述しdate_default_timezone_set(‘Asia/Tokyo’);が必須です。
Q.文字列型の日付を日付型(タイムスタンプ)にしてから、希望の文字列に
A.パターンA 日にちを時間に変換して日付型(月と日)に変換する
$md = date('n/j', strtotime('2021/4/15'));
パターンB 指定した書式に変換して日付型(月と日)に変換する
$md = DateTime::createFromFormat('Y/m/d', '2021/4/15')->format('n/j');
パターンAもBも「4/15」を返すので、Aの方がラクかもしれません。
参考元・Thanks
パターンC MySQLのテーブル内のdatetime型をdate_formatを使って表示
$date = date_create($row['print_day']);
$yyyymd = date_format($date, 'Y年n月j日 G:i');
Q.次の文で日付の判定で正しく動作していたのが、急に誤判定するようになった
if (date(‘Y/n/j’, strtotime($value2[0])) >= date(‘Y/n/j’, strtotime(‘-2 day’))){
A.たとえば
8/9 >= 8/7
8/10 >= 8/8
と人間はどちらも「正」と思っていても、PHPとしては
2021/8/9 >= 2021/8/7 〇
2021/8/10 >= 2021/8/8 X
となっていた模様です。そこでフォーマット(書式)を
if (date(‘Y/m/d’, strtotime($value2[0])) >= date(‘Y/m/d’, strtotime(‘-2 day’))){
に変えた結果
2021/08/10 >= 2021/08/08 〇
となりました。
変更箇所の’Y/n/j’と’Y/m/d’の違いは月や日が1桁の時
ゼロがつかない’Y/n/j’
ゼロがつく’Y/m/d’
で、現時点では日付の比較はゼロがつく’Y/m/d’で行うべきという判断です。
Q.入力した日付が存在するかどうかの日付チェックは?
A. checkdate関数(公式)で解決できます。サンプルはHTML出力しているので、<br>タグなどは無視して下さい
サンプル
if (checkdate($m, $d, $y) == FALSE){ echo "{$y}年{$m}月{$d}日は存在しません<br>"; echo "</body></html>"; Exit; }
→PHPメニューへ戻る