date('Y-m-d')は、2026-03-14のように今日の日付を文字列で返します。1つ目の引数はフォーマット文字列で、各文字が日付の一部を表し(Yは年、mは月、dは日、H:i:sは時刻)、任意の2つ目の引数には、現在の瞬間の代わりにフォーマットするUnixタイムスタンプを渡します。
出力はUTCでの現在の日時なので、Runを押すたびに変わります。フォーマット文字列のすべての文字と、その間にただのテキストを入れる方法は、PHPの日付フォーマットのページにあります。
タイムスタンプ:time()、mktime()、strtotime()
Unixタイムスタンプは、1970年1月1日午前0時(UTC)からの秒数です。time()は現在のタイムスタンプを返し、mktime(hour, minute, second, month, day, year)は部品からタイムスタンプを作り、strtotime()は英語で書かれた日付('2026-03-14'、'+1 week'、'next monday')を読み取ります。どのタイムスタンプもdate()の2つ目の引数として渡せます。strtotime()の2つ目の引数は相対的な表現の起点となる瞬間で、省くと現在から数えます。
出力:
1773480600
Sat, 14 Mar 2026 09:30
2027-01-01
tomorrow Sun 2026-03-15
+1 week Sat 2026-03-21
next monday Mon 2026-03-16
last day of this month Tue 2026-03-31
first monday of next month Mon 2026-04-06
bool(false)
mktime()の繰り上がりは便利です。ある月の0日はその前の月の末日なので、mktime(0, 0, 0, 3, 0, 2026)は2月28日です。結果は渡す前に必ずfalseと比較しましょう。date('Y-m-d', false)は、誰も意図していない1970-01-01を黙って出力してしまいます。
日付に日数を足す
出力以上のことをするならDateTimeImmutableを使います。そのmodify()メソッドはstrtotime()と同じ表現を受け取って新しい日付を返し、add()はP7D(7日間)やPT90M(90分)のようなDateIntervalを受け取ります。
出力:
2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28
2月31日は存在しないので、1月31日に+1 monthすると3月3日になります。「来月の末日」を意味するなら、last day of next monthとそう書きましょう。
DateTimeとDateTimeImmutableの違い
DateTimeは、modify()、add()、setDate()を呼ぶと自分自身を変更し、同じオブジェクトを返します。元の日付を変数に残しておくつもりの人は驚きます。
出力:
2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21
新しいコードではDateTimeImmutableを選びましょう。どちらのクラスも同じメソッドを持ち、どちらもDateTimeInterfaceを実装しているので、関数はどちらも受け付けられます。
2つの日付の差
diff()はDateIntervalを返します。そのdaysプロパティは2つの日付の間の合計の日数で、y、m、dは差を年、月、日に分けたもので、年齢の計算にちょうど必要なものです。日付を変えて、もう一度実行してみてください。
出力:
Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days
format()では、%aは合計の日数、%dは日の部分だけなので、「あと何日」には%aを使います。差を求めずに2つの日付を比べるだけなら、普通の演算子が日付のオブジェクトに使えます:$today < $christmasはtrueです。
タイムゾーン
date()とnew DateTimeImmutable()はデフォルトのタイムゾーンを使い、それはphp.iniのdate.timezoneから来ます(設定されていなければUTC)。スクリプト全体に設定するにはdate_default_timezone_set()を使い、1つの日付だけに独自のDateTimeZoneを与えてsetTimezone()で変換することもできます。
出力:
Asia/Tokyo 2026-03-14 18:30 JST +09:00
Europe/Berlin 2026-03-14 10:30 CET +01:00
America/New_York 2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30
タイムスタンプはどこでも同じ数値で、タイムゾーンが変えるのは書き方だけです。だからこそ、日付はUTCで保存し、表示するときに変換するのが定番のアドバイスです。
Webページにカレンダーを表示する
日付はHTMLに出力されることがいちばん多いものです。このブロックは今月をカレンダーとして描き、今日を強調します。実行してからPreviousかNextをクリックすると、リンクから$_GET['m'](?m=2026-04など)がセットされた状態で同じスクリプトがもう一度実行されます。
format('N')は曜日を1(月曜日)から7(日曜日)で返し、それが1日の前に置く空のセルの数になり、format('t')はその月の日数を返します。'!Y-m'の!はフォーマットが触れないすべてのフィールドをリセットするので、日は1日、時刻は午前0時になります。
date()のよくあるミス
date()の2つ目の引数は、日付の文字列ではなくタイムスタンプでなければなりません。次の行は、
<?php
echo date('d/m/Y', '2026-03-14');
TypeErrorでスクリプトを止めます。
PHP Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2
先にstrtotime()かオブジェクトで文字列を変換します。
出力:
14/03/2026
14/03/2026
bool(false)
bool(true)
ほかにも気をつけたい点が2つあります。mは月でiは分なので、'H:m'は分が欲しいところに月を出力します。またnew DateTimeImmutable('garbage')はfalseを返す代わりに例外を投げるので、ユーザーの入力はtry/catchで包むか、一致しなければfalseを返すDateTimeImmutable::createFromFormat()で解析しましょう。
よくある質問
PHPで現在の日付を取得するには?
フォーマット文字列を付けてdate()を呼びます:echo date('Y-m-d');は2026-03-14のように今日の日付を出力し、date('Y-m-d H:i:s')は時刻も加えます。オブジェクト版は(new DateTimeImmutable())->format('Y-m-d')です。
PHPで日付に日数を足すには?
DateTimeImmutableのmodify()を使います:(new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d')は2026-03-21になります。タイムスタンプなら、date('Y-m-d', strtotime('+7 days', $timestamp))で同じことができます。
PHPで2つの日付の差を計算するには?
一方の日付でもう一方を引数にしてdiff()を呼びます:$a->diff($b)はDateIntervalを返します。そのdaysプロパティは合計の日数で、y、m、dは年、月、日を持ち、これで人の年齢を計算します。
PHPでUnixタイムスタンプを日付に変換するには?
date()の2つ目の引数として渡します:date('Y-m-d H:i:s', 1773479107)はUTCで2026-03-14 09:05:07を返します。オブジェクトならnew DateTimeImmutable('@1773479107')を使います。
PHPのdate()が間違った時刻を表示するのはなぜですか?
date()はデフォルトのタイムゾーンを使い、それはphp.iniのdate.timezoneから来ていて、UTCであることがよくあります。スクリプトの先頭でdate_default_timezone_set('Europe/Berlin')のように自分のタイムゾーンを設定するか、DateTimeImmutableにDateTimeZoneを渡します。