こんにちは、らいか(@hideiwa1)です。
今回は、PHPで日付や時間を取得する方法を解説します。
日付の形式
日付の形式には、「英文形式」と「Unixタイムスタンプ」の2種類があります。
英文形式
“2022-01-01” のような、文字列型での表記
Unixタイムスタンプ
”協定世界時(UTC)での1970年1月1日午前0時0分0秒からの形式的な経過秒数”
“1640962800” のような、整数型での表記
date()関数で日付を扱う
現在の日付を取得する
まずは、date()関数を使った、日付の取り扱いを見ていきましょう。
date(‘フォーマット’ [, Unixタイムスタンプ])
[]は省略可能
第2引数のタイムスタンプを省略した場合、現在日時を取得します。
フォーマットに関しては、下記の文字が使用できます。
年 | Y | 4桁の数字 | 2022 |
y | 2桁の数字 | 22 | |
L | 閏年かどうか(閏年なら1、それ以外は0) | 1 or 0 | |
月 | F | フルスペルの英語 | January |
M | 3文字の英語 | Jan | |
m | 0を付けた数字 | 01 | |
n | 0を付けない数字 | 1 | |
日 | l(小文字の’L’) | フルスペルの英語(曜日) | Monday |
D | 3文字の英語(曜日) | Mon | |
d | 0を付けた数字 | 01 | |
j | 0を付けない数字 | 1 | |
時 | H | 24時間単位、0を付ける | 00 |
G | 24時間単位、0を付けない | 23 | |
h | 12時間単位、0を付ける | 01 | |
g | 12時間単位、0を付けない | 12 | |
分 | i | 0を付けた数字 | 00 |
秒 | s | 0を付けた数字 | 00 |
date('Y/m/d H:i:s'); // 2022/05/08 22:24:02
date('y年n月j日'); //22年5月8日
date('F Y h:i:s'); //May 2022 10:24:02
任意の日付をフォーマットする
先ほどは現在の日付を扱いましたが、今度は任意の日付を扱ってみましょう。
例えば、DBから取得した日付をフォーマットしたい場合などです。
この場合、日付は基本的に英文形式で設定されていると思うので、こちらをUnixタイムスタンプへ変換する必要があります。
Unixタイムスタンプへの変換は、strtotime() 関数を使用します。
strtotime(‘日付’); // 英文形式からUnixタイムスタンプへ変換
そして、先ほど使用したdate() 関数を使用してフォーマットを行います。
date() 関数で日付を指定するには、第2引数にUnixタイムスタンプを指定します。
$data = '2019-02-27';
date('Y年n月j日' , strtotime($data) ); // 2019年2月27日
date() 関数の注意点
date() 関数で日付を取得、表示する方法を解説してきましたが、date() 関数には1つ問題があります。
それが、「2038年問題」です。
date() 関数がUnixタイムスタンプを使用している関係で、扱える数字に桁数の制限があります。
そのため、2038年以降の日付はエラーとなって取り扱うことが出来ません。
この問題を回避するためには、後述のDateTimeクラスを使用する必要があります。
DateTimeクラスで日付を扱う
現在の日付を取得する
次は、DateTimeクラスを使用した日付の扱いを見てみましょう。
DateTimeクラスを使用してDateTimeオブジェクトを作成し、そのオブジェクトを元にフォーマットなどを行っていきます。
詳しくはオブジェクト指向の概念を理解する必要がありますが、日付の扱いだけであれば、それほど難しくはないと思います。
$date = new DateTime(‘日付’);
日付からDateTimeオブジェクトを作成、省略した場合は現在日時で作成
$date -> format(‘フォーマット’); // 日時をフォーマットに変換
まずは new DateTime() で新しいDateTimeオブジェクトを作成します。
この際に日付を指定しなければ、現在の日付でオブジェクトが作成されます。
次に、->format() で表示形式を指定します。
フォーマットに関しては、date() 関数と同じ文字が使用できます。
$date = new DateTime();
$date->format('Y/m/d H:i:s'); // 2022/05/08 22:24:02
$date->format('y年n月j日'); //22年5月8日
$date->format('F Y h:i:s'); //May 2022 10:24:02
任意の日付をフォーマットする
次に、任意の日付を扱う場合です。
DateTimeオブジェクトを作成する際に、日付を引数に指定します。
date() 関数のように、Unixタイムスタンプではなく、英文形式の日付で指定します。
$date = new DateTime('2019-02-27');
$date->format('Y年n月j日'); // 2019年2月27日
まとめ
$date = date(‘フォーマット’); // 現在の日付
$date = date(‘フォーマット’, strtotime(‘日付’)); // 指定の日付
$date = new DateTime(); // 現在の日付
$date = new DateTime(‘日付’); // 指定の日付
$date -> format(‘フォーマット’); //フォーマット