PHPの日付フォーマットは、文字が日付の部品を表す文字列です:date('Y-m-d H:i:s')は2026-03-14 09:05:07のように出力します。Yは4桁の年、mは月、dは日、Hは時(24時間制)、iは分、sは秒で、-、/、:のようにフォーマット文字でないものはそのまま出力されます。同じフォーマット文字列がdate()でもDateTimeImmutable::format()でも使えます。
$formatを変えてRunを押してください。日付は2026年3月14日(土)09:05:07に固定してあるので、各文字が何をするかが正確にわかります。
出力:
Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM
date($format)は現在の瞬間を、date($format, $timestamp)はタイムスタンプを、$date->format($format)は日付のオブジェクトを整形します。strtotime()からタイムゾーンまで、日付についてのそのほかのことはPHPのdate()のページにあります。
日付のフォーマット文字
下の例はすべて、UTCの2026-03-14 09:05:07.123456に対する結果です。
日
| 文字 | 意味 | 例 |
|---|---|---|
d | 日、先頭にゼロを付けた2桁(01から31) | 14 |
j | 日、先頭にゼロなし(1から31) | 14 |
D | 曜日の短い名前、3文字 | Sat |
l(小文字のL) | 曜日の完全な名前 | Saturday |
N | ISOの曜日、1(月曜日)から7(日曜日) | 6 |
w | 曜日、0(日曜日)から6(土曜日) | 6 |
S | 日に付ける英語の接尾辞:st、nd、rd、th。jのあとに使う | th |
z | 年間の通算日、0から始まる | 72 |
週と月
| 文字 | 意味 | 例 |
|---|---|---|
W | ISO 8601の週番号(週は月曜日始まり) | 11 |
F | 月の完全な名前 | March |
M | 月の短い名前、3文字 | Mar |
m | 月の数字、先頭にゼロ付き(01から12) | 03 |
n | 月の数字、先頭にゼロなし(1から12) | 3 |
t | その月の日数 | 31 |
年
| 文字 | 意味 | 例 |
|---|---|---|
Y | 完全な年、4桁以上 | 2026 |
y | 年、2桁 | 26 |
L | うるう年なら1、そうでなければ0 | 0 |
o | ISO 8601の週番号の年(Wと一緒に使う) | 2026 |
X | 符号付きの拡張された完全な年(PHP 8.2以降) | +2026 |
x | 拡張された完全な年、必要なときだけ符号付き(PHP 8.2以降) | 2026 |
時刻
| 文字 | 意味 | 例 |
|---|---|---|
H | 時、24時間制、先頭にゼロ付き(00から23) | 09 |
G | 時、24時間制、先頭にゼロなし(0から23) | 9 |
h | 時、12時間制、先頭にゼロ付き(01から12) | 09 |
g | 時、12時間制、先頭にゼロなし(1から12) | 9 |
i | 分、先頭にゼロ付き(00から59) | 05 |
s | 秒、先頭にゼロ付き(00から59) | 07 |
a | amかpm | am |
A | AMかPM | AM |
v | ミリ秒 | 123 |
u | マイクロ秒(整数の秒を受け取るdate()では常に000000) | 123456 |
B | スウォッチ・インターネットタイム(000から999) | 420 |
タイムゾーン
| 文字 | 意味 | 例 |
|---|---|---|
e | タイムゾーンの識別子 | UTC |
T | タイムゾーンの略称 | UTC |
P | UTCとの時差、コロン付き | +00:00 |
p | Pと同じだが、UTCならZ | Z |
O | UTCとの時差、コロンなし | +0000 |
Z | 時差の秒数 | 0 |
I(大文字のi) | 夏時間中なら1、そうでなければ0 | 0 |
完全な日付と時刻
| 文字 | 意味 | 例 |
|---|---|---|
c | ISO 8601の日付と時刻 | 2026-03-14T09:05:07+00:00 |
r | メールのヘッダーで使うRFC 2822の日付 | Sat, 14 Mar 2026 09:05:07 +0000 |
U | Unixタイムスタンプ(1970-01-01 UTCからの秒数) | 1773479107 |
同じ表をライブで確認できます。このブロックは、選んだ日付に対してすべての文字を出力します。自分の誕生日、午後の日付、うるう年の年末などを入れてみてください。
フォーマットの中に文字や単語を出力する
フォーマット文字列の中の英字はどれもフォーマット文字として読まれるので、'Today is l'は「Today is」を出力しません。T、o、d、a、y、i、sはすべてフォーマット文字だからです。そのまま出力したい英字の前にはバックスラッシュを置きます。ダブルクォートの文字列では\tがすでにタブ文字なので、バックスラッシュを含むフォーマットにはシングルクォートを使います。
出力:
UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 09UTC 14th
よく使う日付フォーマット
ほとんどのコードで必要なフォーマットはほんの一握りです。このブロックはそれらをHTMLの表として出力するので、Pageタブに表示されます。
日付はY-m-dかY-m-d H:i:sで保存して比較しましょう。この順番の文字列は日付と同じ順に並べ替えられますが、d/m/Yの文字列はそうなりません。
ISO 8601、DATE_ATOMなどの標準フォーマット
PHPには、API、フィード、Cookieが期待するフォーマットの定数があります。DATE_ATOM(DateTimeInterface::ATOMも同じ)はISO 8601かつRFC 3339で、JSONのAPIが使うフォーマットです。
出力:
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07.000+00:00
Sat, 14 Mar 2026 09:05:07 +0000
Sat, 14 Mar 2026 09:05:07 +0000
Saturday, 14-Mar-2026 09:05:07 UTC
Y-m-d\TH:i:sP
DATE_ISO8601という定数もありますが、そのオフセットにはコロンがなく(+0000)、ISO 8601はその形では認めていないので、DATE_ATOMを使いましょう。
日本語の日付フォーマット(Y年m月d日)
フォーマット文字でない文字は漢字も含めてそのまま出力されるので、'Y年n月j日'は書いたとおりに動きます。nとjは先頭のゼロを落とし(3月14日)、mとdはゼロを残します(03月14日)。曜日はdate()が英語の名前しか知らないので翻訳できない唯一の部分です。代わりにwの数値を自分の一覧に対応させます。
出力:
2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14
ほかの言語の月の名前や和暦(令和)を含む完全なローカライズには、intl拡張のIntlDateFormatterがロケールのパターンで整形します。使うのはこのページのPHPの文字ではなく、ICUのパターン文字(yyyy、MM、EEEE)です。
<?php
$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Asia/Tokyo');
echo $formatter->format(new DateTimeImmutable('2026-03-14')); // 2026年3月14日土曜日
$era = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::LONG, IntlDateFormatter::NONE, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);
echo $era->format(new DateTimeImmutable('2026-03-14')); // 令和8年3月14日
日付をあるフォーマットから別のフォーマットに変換する
14/03/2026を2026-03-14にするには、DateTimeImmutable::createFromFormat()を使って書かれているフォーマットで文字列を解析し、もう一度整形します。使う文字は表と同じです。フォーマットは!で始めましょう。そうしないと、与えなかったフィールド(ここでは時刻)が現在の瞬間から埋められます。
出力:
2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
[10] => The parsed date was invalid
)
ユーザーが入力した日付では、getLastErrors()からの警告はfalseと同じく不正な日付として扱いましょう。
日付フォーマットのよくあるミス
何度も出てくるバグが3つあります。iのつもりのm、Yとy、そしてstrtotime()に日と月の順番を推測させることです。strtotime()はスラッシュをアメリカ式の月/日の順、ダッシュやドットを日-月の順として読むので、同じ数字が2つの違う日付になります。
出力:
09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)
入力のフォーマットがわかっているなら、strtotime()に推測させずにcreateFromFormat()でそれを伝えましょう。
よくある質問
PHPのdate('Y-m-d')はどういう意味ですか?
各文字が日付の一部に置き換えられます。Yは4桁の年、mは先頭にゼロの付いた月、dは先頭にゼロの付いた日で、ダッシュはそのまま出力されます。2026年3月14日なら2026-03-14を返します。
PHPで日付をあるフォーマットから別のフォーマットに変換するには?
元のフォーマットで解析してから、欲しいフォーマットで整形します:DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d')は2026-03-14を返します。createFromFormat()は文字列が一致しないとfalseを返すので、先にそれを確認しましょう。
PHPの日付フォーマットのmとiの違いは何ですか?
mは月(01から12)、iは分(00から59)です。'H:i'の代わりに'H:m'と書くのはよくあるバグで、時刻の分のところに月の数字が表示されてしまいます。
PHPで日付をISO 8601形式にするには?
cの文字かDATE_ATOM定数を使います:$date->format(DATE_ATOM)は2026-03-14T09:05:07+00:00を返します。DATE_ISO8601は避けましょう。そのオフセットにはコロンがなく(+0000)、正しいISO 8601ではありません。
PHPのdate()で曜日を日本語で表示するには?
date()は英語の名前しか出力しないので、wの数値(日曜日の0から土曜日の6)を自分の一覧に対応させます:['日','月','火','水','木','金','土'][$date->format('w')]。intl拡張があれば、IntlDateFormatterで日付全体を任意のロケールで整形できます。