PHPでは、date関数を使用することで、タイムスタンプより、いろいろな日付や時刻を表現できます。もし、いつも同じ日付表現を使っているのなら、もったいない。今回は、date関数で使えるフォーマットについて、詳しく解説します。
目次
PHPのdate関数の基本
PHPでは、タイムスタンプの整数の数字から、日付や時間を計算します。そして、タイムスタンプから日付や時間を表示するための文字列を作る関数がdateです。
まずは、date関数の基本について解説します。
date関数の文法
先ほど紹介したように、date関数はタイムスタンプから日付や時間を表示するための文字列を作る関数です。そして、date関数は、引数に文字列に変換するためのフォーマットと、タイムスタンプを指定します。
date( フォーマット, タイムスタンプ )
なお、タイムスタンプは省略が可能で、省略した場合は実行された時点の日時に相当するタイムスタンプが使われます。また、タイムスタンプを指定する場合、time関数やstrtotime関数で作成した数字を利用してください。
date関数で使用できるフォーマットについては、次に簡単に紹介します。
date関数で使えるフォーマット
date関数では、年や月などに対応した特定のアルファベットと、そのアルファベット以外の文字と組み合わせた書式のフォーマットを利用します。
なお、フォーマットに対応したアルファベットは、大文字と小文字が別で、その種類は30を超えています。個々のアルファベットについては、ここで紹介しないので、フォーマットを作る場合は、PHPの公式サイトにある対応表をチェックしてください。
PHP: DateTime::format – Manual
フォーマットの例
1 |
"Y-m-d" |
この例は、Yに対応した4桁の西暦の数字、mに対応した月に対応する数字、dに対応した日に対応する数字を、-で接続した文字列を作ります。
date関数の使用例
1 2 3 4 5 |
<?php echo date("Y-m-d") . "\n"; // 出力例 2021-01-01 ?> |
date関数の2038年問題
先ほど、date関数がタイムスタンプを使って日時を表示する文字列を作成すると説明しましたが、このタイムスタンプとは、コンピュータの内部時計を基に計算される数です。
そして、PHPのタイムスタンプは、linuxのタイムスタンプをそのまま使っており、1970年1月1日の0時を0とし、32ビットの整数として扱います。
そして、32ビットの整数はかなり大きな数字ですが、2038年1月19日に使いきってしまうことが解っています。
そのため、PHPの標準のタイムスタンプの利用は推奨されていません。DateTimeクラスを利用してください。そして、DateTimeクラスで使える日時を文字列に変換するためのフォーマットは、date関数と同じです。
これから新規に開発するWebシステムでは、date関数ではなく、DateTimeクラスを利用してください。
DateTimeクラスの使った例
1 2 3 4 |
<?php $date = new DateTime(); echo $date->format('Y-m-d') . "\n"; // 出力例 2021-01-01 ?> |
date関数の日時フォーマットの応用例
date関数のフォーマットで表示できるのは数字だけではありません。配列をうまく組み合わせれば、PHPでHTMLを作ってWebブラウザで表示すれば日本語や画像などでも表示可能です。
次から、date関数のフォーマットを使い、日時を表示する文字列を作る応用例を紹介します。
曜日をカスタマイズする
date関数のフォーマットには、曜日を表示する機能があります。しかし、英語の表記のみで、日本の曜日を表現できません。
日本語の曜日を表現するには、配列で日本語の曜日を用意して、date関数で曜日に対応した数字を作り、数字に対応した配列を表示する方法が使われます。
例えば、date関数のフォーマットに使われる「w」は、日曜日の0から土曜日の7までの、曜日に対応した数字を出力します。これを使うことで、配列に格納した日本語の曜日を表示できます。
日本語の曜日を使ったdate関数の例
1 2 3 4 5 6 |
<?php $week = ["日", "月", "火", "水", "木", "金", "土"]; $date = new DateTime(); $str = $date>format("西暦Y年m月d日") . $week[$date->format("w")] . "曜日"; echo $str . "\n"; ?> |
この例では、DateTimeクラスを使い、年月日を表現する日本語のフォーマットと、配列$weekに格納された曜日を、フォーマット文字の「w」と使って表示しています。
月名を特別な名称にする
先ほどの週名と同じように月名も、数字だけでなく特別な名称で表示することが可能です。
なお、月を数字で表示する場合は、01から12まで2桁の数字にフォーマットする「m」が使われますが、先ほどのように配列を使って表示する場合は、1から12までの数字にフォーマットする「n」を使います。
特別な月名を使う例
1 2 3 4 5 6 |
<?php $month = ["1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg","9.jpg","10.jpg","11.jpg","12.jpg"] $date = new DateTime(); $str = '<img src="./img/' . $month[$date->format("n")-1] . '">' . $date->format("j日"); echo $str . "\n"; ?> |
この例は、月毎に画像を用意し、その画像と何日かをテキストでWebページに表示する例です。月名を画像にすることで、色を変えたり背景に季節を感じさせる小さなイラストを入れるなど、表現の幅を広げられます。
AM/PM付の時刻表示の例
コンピュータのログファイルに出力する時刻は、24時間で表示するのが一般的です。しかし、人が見る場合は、AM/PMを付けて、12時間で表示する方法も使われます。
そして、date関数のフォーマットには、12時間で表示する機能があるので、AM/PM付の時刻を作ることが可能です。
12時間で表示する例
1 2 3 4 5 |
<?php $date = new DateTime(); $str = $date->format("A g:i"); echo $str . "\n"; // 表示例 AM 10:00 ?> |
この例は、date関数のフォーマットの「A」は、大文字の「AM」または「PM」に、また「g」で12時間表示の時間の文字列にすることで、時刻を12時間で表現する文字列を作ります。
DateTimeでタイムスタンプを作るには
PHPで日時を扱う際、DateTimeクラスを使えば、特定の日時のタイムスタンプを簡単に作れます。具体的には、「2021-01-01」といった標準的な日付表記の他に、date関数で使われるアルファベットを用いたフォーマットの指定も可能です。
次から、DateTimeクラスでタイムスタンプを作る方法を紹介します。
省略した場合は今のタイムスタンプ
DateTimeをインスタンスする際、日時を省略した場合は、今の時点のタイムスタンプを作成します。
日時を省略した場合の例
1 2 3 4 |
<?php $date = new DateTime(); echo $date->format("Y-m-d H:i:s"); // 表示例 2021-01-01 10:12:13 ?> |
標準的な日付で指定した例
DateTimeの標準的な日時の指定方法は、date関数のフォーマットで「Y-m-d」または「Y-m-d H:i:s」と指定したのと同じです。
具体的には、次のように指定します。
日付を指定してタイムスタンプを作成した例
1 2 3 4 |
<?php $date = new DateTime("2021-01-01"); echo $date->format("Y-m-d H:i:s") . "\n"; // 表示例 2021-01-01 00:00:00 ?> |
日時を指定してタイムスタンプを作成した例
1 2 3 4 |
<?php $date = new DateTime("2021-01-01 12:00:00"); echo $date->format("Y-m-d H:i:s") . "\n"; // 表示例 2021-01-01 12:00:00 ?> |
フォーマットに日時を指定した例
DateTimeクラスでは、date関数のフォーマットと同じアルファベットを組み合わせて、任意のフォーマットでタイムスタンプを作成できます。
フォーマットで指定する例
1 2 3 4 |
<?php $date = DateTime::createFormFormat("Y-m-d H:i:s", "2021-01-02 01:23:45"); echo $date->format("Y-m-d H:i:s") . "\n"; // 表示例 2021-01-02 01:23:45 ?> |
また、フォーマットを作るアルファベットを組み合わせると、次のようなフォーマットも使えます。
フォーマットで指定する例
1 2 3 4 |
<?php $date = DateTime::createFormFormat("Y/n/j G:i", "2021/1/2 1:23"); echo $date->format("Y-m-d H:i:s") . "\n"; // 表示例 2021-01-02 1: ?> |
この例では、月と日、時刻の数字を、0を含む2桁ではなく1桁で入力えきるフォーマット文字を使い、タイムスタンプを作成し、formatメソッドで上の例と同じ書式で日時を表示します。
まとめ
これまで説明したように、PHPではdate関数を使い、タイムスタンプから任意のフォーマットで日付や時間の文字列を作れます。
しかし、date関数は、2038年問題を抱えています。もし、PHPで新規に日時を使うプログラムを開発するのなら、DateTimeクラスを利用してください。
DateTimeクラスでは、date関数と同じフォーマットが使用できます。さらに、同じようなフォーマットを指定して、タイムスタンプを作ることも可能です。新しくPHPでWebシステムを利用する場合は、DateTimeクラスを利用しましょう。