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の説明が逆では?
確かに逆になってますね。
修正させていただきます。
ご指摘誠にありがとうございます。