[PHP]日付関連
トップページへ
たまに使う事例
日時を指定しなければ「現在(今日)を基準」となります。
一日前(前日) strtotime("-1 day") 一週間前 strtotime("-1 week") 一か月前 strtotime("-1 month") 一年前 strtotime("-1 year") 1時間前 strtotime( '-1 hour' ); 例文 ファイルの日付の3時間前 strtotime( '-3 hour', filemtime($ffile) )
date()とdate_format()
パラメータの型が違う点がありますが「日付が2022年の値」なら、どちらも「2022」を返します。
date(‘Y’, strtotime(日付) )
date_format(日付, ‘Y’) *この日付はDateTime オブジェクトで、文字列ではありません
なぜこだわるのか?と言いますと
変更前
$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.単純に英文形式の日付を Unix タイムスタンプに変換したい
A.
date_default_timezone_set('Asia/Tokyo'); date('c', strtotime( '2023-6-11 0:00:00' ) );
‘c’については日付文字列式の書式をご覧下さい。
(抜粋 c、ISO 8601 日付、2004-02-12T15:19:21+00:00)
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' ); date( 'Y-m-d H:i:s' ); など その際、設定できる書式。
例. 2022/2/2の時 date(“n月j日現在”) → 2月2日現在
他の方法 strtotime(‘today’)
参考:today→指定できる書式
また現在のUnixタイムスタンプを知りたい時は time()
サンプル 今日と同じ日のデータは?
if (date('Y/n/j', strtotime($clus_day)) == date('Y/n/j')){
※もし、データ中の日付==今日 と一致したら
Q.現在の時刻?
A.一例 date(“H:i:s”);
秒は不要 date(“H:i”);
Q.時間帯で処理を分ける
A.eg. 0時00分01秒から17時59分59秒までは「処理A」、それ以外の時間帯では「処理B」
事前に date_default_timezone_set で日本の標準時刻にする必要があります。
//必須 date_default_timezone_set('Asia/Tokyo'); $w_hhiiss = strtotime( date("H:i:s") ); // 0:00:01~17:59:59まで if ( ( $w_hhiiss > strtotime('00:00:00') ) and ( $w_hhiiss < strtotime('18:00:00') ) ) { 処理A }else{ 処理B }
Q.昨日は?
A. strtotime(‘-1 day’);
使用例
date("Y/n/j時点", strtotime('-1 day'));
参考:now,todayなど→指定できる書式
単に「前日の日付を表示させる場合」なら、問題ない。
しかし
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'))){れ
その他の例
date('Y年n月j日', strtotime( '2023-01-05' ) )
→実行すると 2023年1月5日
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 日にちを時間に変換して日付型(月と日)に変換する。同様にMySQL内の項目を日付表示する
$md = date('n/j', strtotime('2021/4/15'));
MySQL内の項目を日付表示 date('Y年n月j日', strtotime( $row['update']) )
パターン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(楽天市場で探す ・ amazonで探す)としては
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; }
サンプル
date(‘n月j日(曜) A g:i’, strtotime( $row[‘post_date’] ));
→3月7日(曜) PM 6:08
*曜(曜日)は手動で表記する必要があります。(月、火等はそのままでは出ません)
→PHPメニューへ戻る