[PHP]日付関連

 

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メニューへ戻る

 

この記事のQRコード
カテゴリー PHP
[ PHP 関係の記事 ]へもどる


8679
amazonでPHPと検索した結果
*該当しない場合があります