エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法

      2024/09/08

CakePHP4のFrozenDateで1ヵ月前、今月1日、来月末などの条件を指定して日付を算出する方法

 
プログラムを作成する際に、下記のような特定の条件に基づいて日付を算出する場合があるかと思います。
・先月の 1日
・来月の月末
・1ヵ月前の日付
 
CakePHP4では「FrozenTime」「FrozenDate」という便利な関数が用意されていますので、これを使用すると簡単に算出することができますので、ご紹介します。
 
 

PHP8.1未満では日付を扱う関数にバグがありPHP8.1以上で使用しよう

 
注意点:この記事の内容は、PHP8.1以降向けです。
 
PHPの日付を計算する処理にはバグがあり、PHP8.1未満では正しく動作しない場合があります。
 
具体的には「DateTime::diff」にバグがあったようです。
 https://bugs.php.net/bug.php?id=79452
 
該当のバグは PHP8.1では修正されていますので、この記事の内容を使用する場合は、PHPのバージョンを確認してください。
 
なお、PHP 8.1未満のバージョンは、すでにセキュリティサポートも終了していますので、速やかにバージョンアップする方がいいかと思います。(難しい場合があることも分かりますが...)
 
また、古い記事を読むと、「1ヶ月後などの計算をすると、正しくない値になる」という記事が散見されます。
https://search.yahoo.co.jp/search?ei=UTF-8&fr=mozff&p=PHP+1%E3%83%B6%E6%9C%88%E5%BE%8C%E3%81%8C%E3%83%90%E3%82%B0%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B
 ※「PHP 1ヶ月後がバグっている」で Google検索の結果
 
これは、PHP8.1未満で発生していたバグですので、これらの不具合は PHP8.1以降では発生しません。
逆に、バグがある前提での処理は、PHP8.1以降では不具合につながる可能性があるかと思います。
 
 

CakePHPで「FrozenDate」を使用して指定の日付を取得する 3つの方法

 
CakePHPの「FrozenDate」を使用して、例えば「今月の最終日」を取得する記述方法は下記の 3つあります。
 
 
まず最初に、use句で使用する処理を設定します。
(「FrozenDate」と「FrozenTime」の違いについては後述します。)
 

 
続けて、Controller内の Action内で下記を記述します。
 

 
いずれの場合も、結果は下記のようなオブジェクトとして取得できます。
 

 
 

CakePHPで「FrozenDate」を使用して様々な条件を指定する方法

 
先のサンプルでは「last day of this month」と記述して、「今月末の日付」を取得していましたが、「last day of this month」を以下のように書き換えることで、いろいろな条件の日付を取得することができます。
 

 
上記は「FrozenDate::parse()」を使用して取得していますが、「$today->modify()」でも「new FrozenDate()」でも同じように条件を指定することができます。
 
また、上記は取得した値をそのまま画面に表示するために「var_export()」関数を使用しています。
「var_export()」関数については下記に記事を書いていますので、併せて参考にしてください。
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
 
 
ちなみに、「FrozenDate」は日付を扱う処理ですが、時間まで扱う「FrozenTime」の方を使用する場合は、下記のように時間・分・秒を加減算することができます。
 

 
 

CakePHPの日付、時間を扱う処理の「FrozenDate」「FrozenTime」

 
CakePHPの日付、時間を扱う処理には「FrozenDate」「FrozenTime」とあります。
 
「FrozenDate」は、年月日を扱う関数です。
「FrozenTime」は、年月日に加え、時分秒を扱う関数です。
 
これを曖昧に使うと結構な問題が発生します。
(実際に私がそれをやってしまっていましたので...)
 
 
では、実際に「FrozenDate」「FrozenTime」を使用して「現在」の情報を取得してみます。
 

 
上記のように実行すると、下記の結果が得られます。
 

 
「FrozenDate」では「時分秒」が「0(値がない)」のに対し、「FrozenTime」ではそれらが存在します。
 
 
この「FrozenDate」と「FrozenTime」の違いをよく理解せずに、「datetime型」の「created」「modified」などの日時の項目に対して SQLの抽出条件に使用すると、想定していない結果が返ってくることがあります。
 
 
例えば、「2024-08-10」~「2024-08-15」を条件に抽出しようとする場合は「FrozenDate」を使う必要があります。
「FrozenTime」を使うと、「時分秒」を持ちますので、実行した時間によって結果が変わってくる、みたいなことが発生してしまいます。
 
お気を付けください...
 
 

CakePHP4の関連記事

CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除

CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。

CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合

CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。

CakePHP 2.3で saveの便利な使い方・サンプルソース付き

CakePHPのレコードを保存、更新する際に使う Saveを詳細解説します。

CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法

CakePHP4でテンプレートやレイアウトファイルをデフォルトから変更する場合は「render()」を使用するが、記述場所はできるだけコントローラー内の最後の方に書く方がいい。

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説

CakePHP4でコマンドプログラムからコンポーネントを呼び出す方法を解説。コントローラーから呼び出すときと大差はないが、use句でコンポーネントを指定する事がポイント。

CakePHP3のCakeDC/Usersのログイン後のリダイレクトを設定解説
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説

CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。

CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつ、テンプレートファイル、設定情報ファイルの場所とそれらをカスタマイズする方法を説明します。

CakePHP 2.3でファイルのアップロード処理を作る

CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。

CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用

CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。