時計表記にはAM(午前)/PM(午後)を示す表記があります。
スマホなどの時計表示は24時表記で、午後1時は13:00と表示されます。
時計の場合は、リアルタイム状況なので24時表記でも特に違和感はありません。
先日、PHPで日時を刻印する書類をPDF出力するものを作成していました。
報告書的な意味合いを持つので、日時記載は必須なのですが、ふとあることに気づきました。
2021-10-31 10:00 と記載された場合、24時記載なの?それとも12時記載なの?
システム的なことを言えば、24時表記なので、午前10時には違いないのですが、PDFに刻印すると24時表記であっても、どっちだろう?
と思ってしまいました。
こういった誤解をなくすために、24時表記でもあえて「AM・PM」表記を付け足すことにしました。
そこで、PHPやMYSQLで「AM・PM」を付け足す方法を調べました。
PHPでAM・PMを付け足す方法
PHPでAM・PMを付け足すのは簡単です。
日付表記にはオプションがあり、AM・PMのオプションを付け足すだけです。
具体的には、オプション「A」を付けます。
記述例は以下の通りです。
■AM/PM表記例
date("Y-m-d A H:i:s", mktime(10, 0, 0, 10, 31, 2021))
date関数で「A」オプションをつけるだけです。
これを実際に動かすと、以下のように表示されます。
午後の表示もテストしてみました。
午後の表示も正しく表示されるかテストしてみました。
■午後の表示テスト
date("Y-m-d A H:i:s", mktime(14, 0, 0, 10, 31, 2021))
PHPで変換するのはオプション「A」をつけるだけでOKでした。
疑問:MYSQLで初めからAM・PM付きにできないの?
そもそもMYSQL上にあるデータを読み取って、PDFへ出力します。
PHP側で変換して「AM・PM」を出力する方法もありますが、MYSQLからデータを読み取った時点で「AM・PM」がついていれば、もっと楽です。
ということで、MYSQL側で変換する方法を調べてみました。
MYSQLで「AM・PM」を付加する方法
データベースのテーブル形式
今回は、以下のデータ形式で検証します。
日時データがあればよいので、「datetime」の変数を使用します。
通常の読み込み方
データベースを読みだす場合、通常は以下のようにSQL文を記述します。
SELECT * FROM time_table;
実行すると、以下のように表示されます。
何もしなければ、24時表記で表示されます。
AM・PMを付加する呼び出し方
「AM・PM」を付加するには次のようにSQL文を記述します。
SELECT sqno, DATE_FORMAT(date, '%Y-%m-%d %p %H:%i') FROM time_table;
日付が入っているdateをDATE_FORMAT()関数で加工します。
実行すると、以下のように呼び出しされます。
MYSQLのDATE_FORMATとは
MYSQLは、SQL文に記述できる関数があります。
DATE_FORMATはその名の通り、日付フォーマットを変える関数です。
以下のように記述します。
DATE_FORMAT(メンバ名, 日付フォーマット指定)
日付フォーマットには、PHPのdate関数オプション同様のオプションがあります。
MYSQL DATE_FORMATのオプションはこちら。
これなら、PHPでその都度変換しなくてもよいので楽です。
ちなみに、バッファに読み込むことを想定して、以下のような記述もできます。
SELECT sqno, DATE_FORMAT(date, '%Y-%m-%d %p %H:%i') AS date FROM time_table
DATE_FORMATに名前を付けないと、バッファにメンバ名が付きません。
それだと不都合が生じやすいので、AS でメンバ名をつけることができます。
実験してみたところ、メンバ名と同じ名前を付けることができました。
※ただし、date, DATE_FORMAT(date, ”) AS date というような、重複記述はエラーになります。
PHPとMYSQLのどちらで加工するかはケースバイケース
MYSQLは小細工なしで実行したほうが速くプログラムの性能を上げることができます。
そういう意味では、PHP側で変換したほうが良いように思えます。
しかし、データ件数が少ないケースではMYSQLで変換するほうが効率が良いです。
どちらで加工するかは、設計段階でのデータ件数想定等の情報をかんがみての判断で行うのがよさそうです。