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






関連記事
[PHP] コメント・注釈

[PHP]ループ、繰り返し

[PHP]配列

[PHP]JavaScriptとの連携

[PHP]雑記帳