Menu

PHPの日付フォーマット:date()のフォーマット文字一覧

PHPの日付フォーマットは'Y-m-d H:i:s'のような文字の並びで、Yは4桁の年、mは月、dは日、Hは時、iは分、sは秒です。すべてのフォーマット文字を例付きで紹介し、エスケープ、ISO 8601、日本語の日付、フォーマットの変換も扱います。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

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
NISOの曜日、1(月曜日)から7(日曜日)6
w曜日、0(日曜日)から6(土曜日)6
S日に付ける英語の接尾辞:st、nd、rd、th。jのあとに使うth
z年間の通算日、0から始まる72

週と月

文字意味例
WISO 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、そうでなければ00
oISO 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
aamかpmam
AAMかPMAM
vミリ秒123
uマイクロ秒(整数の秒を受け取るdate()では常に000000)123456
Bスウォッチ・インターネットタイム(000から999)420

タイムゾーン

文字意味例
eタイムゾーンの識別子UTC
Tタイムゾーンの略称UTC
PUTCとの時差、コロン付き+00:00
pPと同じだが、UTCならZZ
OUTCとの時差、コロンなし+0000
Z時差の秒数0
I(大文字のi)夏時間中なら1、そうでなければ00

完全な日付と時刻

文字意味例
cISO 8601の日付と時刻2026-03-14T09:05:07+00:00
rメールのヘッダーで使うRFC 2822の日付Sat, 14 Mar 2026 09:05:07 +0000
UUnixタイムスタンプ(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で日付全体を任意のロケールで整形できます。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める