【PHP入門】日付・時刻をフォーマットする3つの方法

PHPで日付・時刻をフォーマットする方法

PHP で日付や時刻を任意のフォーマットで出力する方法を解説します。「2000年01月01日」とか「00/01/01」とか、そーゆーことです。

3通りの方法があるので、どれを使うべきかなんて話もしていきます。

目次

(1) date 関数で日付・時刻をフォーマットする方法

ひとつめは date 関数を使う方法です。書き方は次のとおりです。

date('フォーマット文字列', Unixタイムスタンプ)

現在の日時をフォーマットする

Unixタイムスタンプを省略すると、現在の日時を指定したことになります。

$date = date('Y年m月d日 H時i分s秒');
echo $date; //現在の日時が表示される

Unixタイムスタンプを渡してフォーマットする

Unixタイムスタンプを渡すと、任意の日時をフォーマットすることができます。

$date = date('Y年m月d日 H時i分s秒', 946652400);
echo $date; //2000年01月01日 00時00分00秒 と表示される

日付文字列を渡してフォーマットする

Unixタイムスタンプではなく、日時を表す文字列を渡したいときは、strtotime 関数を使います。strtotime は日時を表す文字列をUnixタイムスタンプに変換する関数です。

$date = date('Y年m月d日 H時i分s秒', strtotime('2000-01-01 09:41:00'));
echo $date; //2000年01月01日 09時41分00秒 と表示される

strtotime はどんな日付文字列でも認識できるわけではなく、例えば12th January 2000は認識できるけど2000年1月12日は認識できません。

どんな日時の書式がサポートされているかは下記で確認してください。

実際のところ、MySQL のDATETIME型YYYY-MM-DD hh:mm:ssはサポートしますよということを知っておけば問題ないと思います。

フォーマット文字

フォーマット文字列で使える主なフォーマット文字は次のとおりです。

フォーマット文字説明戻り値
Y4桁の西暦。1999, 2022など
y2桁の西暦。99, 22など
Lうるう年かどうか。1(うるう年)、0(うるう年でない)
m月を表す数字。先頭に0をつける。01から12
n月を表す数字。先頭に0をつけない。1から12
F月を表す英語。JanuaryからDecember
M月を表す3文字の英語。JanからDec
tその月の日数(その月の最終日)28から31
d日を表す2桁の数字。先頭に0をつける。01から31
j日を表す数字。先頭に0をつけない。1から31
曜日D曜日を表す3文字の英語。MonからSun
l曜日を表す英語。MondayからSunday
w曜日を表す数字。0(日曜)から6(土曜)
g12時間単位。先頭に0をつけない。1から12
G24時間単位。先頭に0をつけない。0から23
h12時間単位。先頭に0をつける。01から12
H24時間単位。先頭に0をつける。00から23
a午前/午後。小文字。am,pm
A午前/午後。大文字。AM,PM
i先頭に0をつける。00から59
s先頭に0をつける。00から59

上記以外のフォーマット文字は下記のページで確認してください。

(2) DateTime クラスで日付・時刻をフォーマットする方法

ふたつめが DateTime クラスの format メソッドを使う方法です。次のように書きます。

$date = new DateTime('日付文字列');
$date->format('フォーマット文字列');

サポートされる日付文字列は strtotime 関数と同じです。日付文字列を省略すると、現在の日時を指定したことになります。

フォーマット文字は date 関数と同じです。

使用例です。

$date = new DateTime('2000-01-01 09:41:00');
echo $date->format('Y年m月d日 H時i分s秒'); //2000年01月01日 09時41分00秒 と表示される

(3) DateTimeImmutable クラスで日付・時刻をフォーマットする方法

3つめは DateTimeImmutable クラスです。

DateTime クラスとほぼ同じ動作をします。使い方はまったく同じです。唯一違うところは、DateTimeミュータブルなのに対して、DateTimeImmutableイミュータブルだということです。以上(冷たい)。

ミュータブルとは、オブジェクトの作成後にその状態を変えることができること、イミュータブルとはその状態を変えることができないことだそうです。

なんかよく分からないので実験してみましょう。

//DateTime クラス
$date = new DateTime('2000-01-01');
echo $date->modify('+10 days')->format('Y-m-d'); //10日足すと 2000-01-11 と表示される
echo $date->modify('+5 days')->format('Y-m-d');  //5日足すと 2000-01-16 と表示される

//DateTimeImmutable クラス
$date = new DateTimeImmutable('2000-01-01');
echo $date->modify('+10 days')->format('Y-m-d'); //10日足すと 2000-01-11 と表示される
echo $date->modify('+5 days')->format('Y-m-d');  //5日足すと 2000-01-06 と表示される

おわかりいただけただろうか。1回目のmodifyはどちらも同じ結果なのに、2回目は違ってます。DateTimeクラスでは1回目のmodify$dateオブジェクトが書き換えられたのに対して、DateTimeImmutableでは書き換えられなかったということです。

どっちの動作が好きですか?私はDateTimeImmutableのほうが好きです。クラス名が長いので敬遠されがちですが、日時の計算をする場合はDateTimeImmutableのほうが意図した動作をしてくれそうです。

曜日を日本語で表示する方法

フォーマット文字のセクションではあえて触れませんでしたが、曜日を英語でしか表示できないことに不満を感じてはいませんか?激おこぷんぷん丸(死語)ではありませんか?私は激おこスティックファイナリアリティぷんぷんドリームです(やかましい)。

曜日の日本語表示、やってみましょう。

//日本語の曜日を配列に入れる
$week_jp = array('日','月','火','水','木','金','土');

//date関数の場合
echo $week_jp[date('w')] ;

//DateTimeクラスの場合
$date = new DateTime();
echo $week_jp[$date->format('w')];

どれを使うべきか

日付・時刻をフォーマットする方法として、date関数、DateTimeクラス、DateTimeImmutableクラスの3つを紹介しましたが、どれを使うのがよいのでしょうか。

結論からいうと、DateTimeImmutableを使いましょう。

2038年問題

2038年問題とは2038年1月19日にコンピュータが日時を正しく処理できなくなって誤動作する可能性がある問題です。Y2K問題と似たようなものです。

PHP ではdate関数やstrtotime関数がこの2038年問題の影響を受けます。もうちょい詳しく言うと、64ビット版PHPでは問題ないのですが、32ビット版PHPでは死亡します。

DateTimeクラス、DateTimeImmutableクラスは2038年問題の影響を受けません。

ということなので、date関数よりもDateTimeDateTimeImmutableクラスを使っておくほうが安全といえます。

速度の比較

date関数、DateTimeクラス、DateTimeImmutableクラスの3つの方法の速度を比較してみました。

現在の日時をフォーマットする場合

//date
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
  $date = date('Y年m月d日 H時i分s秒');
}
echo $time = microtime(true) - $start;

//DateTime
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
  $date = new DateTime();
  $date->format('Y年m月d日 H時i分s秒');
}
echo $time = microtime(true) - $start;

//DateTimeImmutable
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
  $date = new DateTimeImmutable();
  $date->format('Y年m月d日 H時i分s秒');
}
echo $time = microtime(true) - $start;
date関数DateTimeクラスDateTimeImmutableクラス
1回目0.06986403465271 秒0.082677841186523 秒0.083433866500854 秒
2回目0.069616079330444 秒0.085881948471069 秒0.082491874694824 秒
3回目0.077422142028809 秒0.084145069122314 秒0.082370042800903 秒

引数を渡さずに現在の日時をフォーマットする場合は、date関数がやや早くて、DateTimeDateTimeImmutableクラスが互角という結果でした。

日付文字列を渡してフォーマットする場合

$str = '2000-01-01 09:41:00';

//date
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
  $date = date('Y年m月d日 H時i分s秒', strtotime($str));
}
echo $time = microtime(true) - $start;

//DateTime
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
  $date = new DateTime($str);
  $date->format('Y年m月d日 H時i分s秒');
}
echo $time = microtime(true) - $start;

//DateTimeImmutable
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
  $date = new DateTimeImmutable($str);
  $date->format('Y年m月d日 H時i分s秒');
}
echo $time = microtime(true) - $start;
date関数DateTimeクラスDateTimeImmutableクラス
1回目0.11821389198303 秒0.11678004264832 秒0.11568713188171 秒
2回目0.11990690231323 秒0.1165189743042 秒0.11692309379578 秒
3回目0.11591219902039 秒0.11851000785828 秒0.11643695831299 秒

日付文字列を渡してフォーマットする場合は、3つともほぼ同じでした。

つまり、

  • 2038年問題を考慮してdate関数は使わない。
  • 日時の計算をするならばDateTimeよりもDateTimeImmutableのほうが安全。
  • 処理速度は3つともほとんど変わらない。

ということで、DateTimeImmutableを使いましょうということに決定しました。以上です。

でわでわ

PHPで日付・時刻をフォーマットする方法

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次