PHPの日付や時間を「○年○月○日」や「○-○-○」など所定のフォーマットで出力する方法です。
date()によるフォーマットの方法と、フォーマット一覧表をご紹介します。
曜日の表示などにも触れています。
目次
date関数でフォーマットする
今日が「2016/01/25」だったとします。
日付をフォーマット
|
1 |
echo date('Y年m月d日'); |
2016年01月25日
今日の日付を「○年○月○日」形式にフォーマットして表示させました。
日時をフォーマット
|
1 |
echo date('Y年m月d日 H時i分s秒'); |
2016年01月25日 20時22分53秒
今日の日付と時間をフォーマットして表示させました。
date関数の構文
date(フォーマット形式 [, タイムスタンプ]([ ]は省略可));
上記サンプルだとフォーマット形式のみの指定で、第二引数のタイムスタンプは指定されていません。
タイムスタンプは省略可能で、省略するとtime()つまり現在の日付を自動で取得してくれます。
フォーマット形式にはYやmといったアルファベットが並んでいますが、これがフォーマット文字列です。
このフォーマット文字列には様々な種類があります。
date関数のフォーマット文字列一覧
以下のように、曜日や月の英語表記などフォーマットもいろいろと用意されています。
よく使われるフォーマットは以下の表を参考にしてください。
| 項目 | フォーマット | 説明 | サンプル |
|---|---|---|---|
| 年 | Y | 西暦(4桁) | 2015 |
| y | 西暦(2桁) | 15 | |
| L | うるう年→1、普通の年→0 | 0 | |
| 月 | m | 月(2桁) | 07 |
| n | 月(先頭の0なし) | 7 | |
| M | 英語(略語) | jul | |
| F | 英語 | july | |
| 日 | d | 日(2桁) | 09 |
| j | 日(先頭の0なし) | 9 | |
| t | その月の日数 | 31 | |
| z | その年の経過日数 | 121 | |
| 曜日・週 | D | 英語(略語) | Tue |
| l | 英語 | Tuesday | |
| w | 曜日 (日曜0→土6) | 2 | |
| W | その年の経過週 (月曜開始) | 28 | |
| 時間 | H | 24時間単位 | 09 |
| G | 24時間単位 (先頭の0なし) | 9 | |
| h | 12時間単位 | 09 | |
| g | 12時間単位 (先頭の0なし) | 9 | |
| a | 午前/午後(小文字) | am | |
| A | 午前/午後(大文字) | AM | |
| 分 | i | 分(2桁) | 09 |
| 秒 | s | 秒(2桁) | 09 |
strtotime関数で所定の日付をフォーマットする
date()で日付を指定してフォーマットする場合は、第二引数にタイムスタンプを指定します。
整数型intのUnixタイムスタンプしか指定できないため、日付をstrtotime()などでタイムスタンプに変換する必要があります。
|
1 2 3 |
$date = '2015-12-31'; echo date('Y年m月d日', strtotime($date)); |
2015年12月31日
変数$dateに日付を格納し、それをdate()の第二引数に指定しますが、その際にstrtotime()でUnixタイムスタンプに変換してやります。
strtotime関数でUnixタイムスタンプに変換
ここで、date()の第二引数に指定するタイムスタンプをstrtotime()で出力してみましょう。
|
1 2 3 |
$date = '2015-12-31'; echo strtotime($date); |
1451487600
10桁の数字が表示されましたが、date()は上記のようなタイムスタンプじゃないと受け付けません。
Unixタイムスタンプとは、協定世界時(UTC)での1970年1月1日午前0時0分0秒からの形式的な経過秒数
strtotime関数の構文
strtotime()は英文形式の日時をUnixタイムスタンプに変換してくれます。
日付の差分を計算したり、1週間後の日付を取得したりと日付の計算の時によく使われますね。
strtotime(‘日付’);
成功時→ タイムスタンプを返す
失敗時→ FALSEを返す
返されるタイムスタンプは整数型intですが、指定する日付は文字列型になります。
2015-12-31のような形式以外にも、Septemberなどの英語の日付表記でも指定できます。
strtotime関数の問題
date()とstrtotime()を使った日付のフォーマットはよく見かけますが、問題もあります。
- 一部環境で2038年1/19以降動作しなくなってしまう(2038年問題)
Unixタイムスタンプを扱うといろいろと問題が出てくるようですね。
次にご紹介するDateTimeクラスだと、そのあたりもクリアされているようです。
PHPのマニュアルでも、日付同士の計算等はDateTimeクラスを使用するよう推奨されています。
DateTimeクラスでフォーマット
先ほどのdate()とstrtotime()でフォーマットするやり方の他に、DateTimeクラスでフォーマットする方法もあります。
PHP5.2からサポートされました。
クラスというとオブジェクト指向となるため、敷居が高いイメージがありますが、今回は日付のフォーマットだけを見ていきます。
意外と難しくないですよ。
日付をフォーマット
|
1 2 3 |
$day = new DateTime(); echo $day->format('Y-m-d'); |
2016-01-25
説明
$day = new DateTime(‘日時(省略したら今の時点での日時)’);
- まず
new DateTime();でDateTimeオブジェクトを作る - そしてそのオブジェクトを変数
$dayに格納
$day->format(‘Y-m-d’);
- 変数
$dayをformatで指定した書式で表示させる
変数$dayはオブジェクト型で、日時やタイムゾーンが格納されています。
そこから日時を->formatで引っ張りだして、Y-m-dの書式でフォーマットしてあげているんですね。
所定の日時をフォーマット
DateTimeクラスも、所定の日付や時間をフォーマットしてくれます。
|
1 2 3 |
$day = new DateTime('2015-12-31 23:59:59'); echo $day->format('Y年m月d日 H時i分s秒'); |
2015年12月31日 23時59分59秒
new DateTime()のカッコの中に日時を指定するだけで、指定した日時で表示させることができました。
これなら2038年問題も起きないため、PHP5.2以上ならDateTimeクラスを採用したいですね。
様々なフォーマットでの表示例
上記のフォーマット一覧表から、いろいろなフォーマットで日時を表示させてみましょう。
date関数で表示
|
1 2 3 4 5 6 7 8 9 |
echo date('Y-m-d'); // 2016-01-25 echo date('Y/n/d'); // 2016/1/25 echo date('Y年'); // 2016年 echo date('n月'); // 1月 echo date('M d, Y'); // Jan 25, 2016 echo date('F d, Y'); // January 25, 2016 echo date('l F d, Y'); // Monday January 25, 2016 echo date('g:i A'); // 9:09 PM echo date('G:i'); // 21:09 |
DateTimeクラスで表示
|
1 2 3 4 5 6 7 8 9 10 11 |
$date = new DateTime(); echo $date->format('Y-m-d'); // 2016-01-25 echo $date->format('Y/n/d'); // 2016/1/25 echo $date->format('Y年'); // 2016年 echo $date->format('n月'); // 1月 echo $date->format('M d, Y'); // Jan 25, 2016 echo $date->format('F d, Y'); // January 25, 2016 echo $date->format('l F d, Y'); // Monday January 25, 2016 echo $date->format('g:i A'); // 9:09 PM echo $date->format('G:i'); // 21:09 |
曜日を日本語で表示
曜日の日本語表記は用意されていませんが、一工夫して日本語の曜日を表示させてみましょう。
|
1 2 3 4 5 6 7 8 9 10 |
$week = array('日', '月', '火', '水', '木', '金', '土'); // date関数の場合 $w = date('w'); // DateTimeクラスの場合 $date = new DateTime(); $w = $date->format('w'); echo $week[$w]; |
月
上記のフォーマット一覧表にもありますが、('w')で曜日を数字で取得します。
- 日曜
0→ 土曜6
これを応用して、以下のように曜日を日本語表記させました。
- 変数
$weekに日〜土の値を順番に格納した配列を用意する - 変数
$wに今日の曜日の番号を格納する(月曜は1) - 変数
$weekは0から始まるキーが連番で振られているので、$week[$w]とすると$week[1]と同等となる $weekの[1]は月曜なので、月と表示される
他にもいろいろなフォーマットがあるので、日付のフォーマット方法を使いこなしていきましょう。

月のフォーマットのMとFの説明が逆では?
確かに逆になってますね。
修正させていただきます。
ご指摘誠にありがとうございます。