JavaScriptを有効にしてください

PHPのDate関数で日付と時刻をマスターしよう!

 · 

PHPのDate関数で日付と時刻をマスターしよう!

PHPのdate関数は、日付や時刻を扱う際に非常に便利な機能です。
このブログでは、date関数の基本的な使い方から、より高度な利用方法までを分かりやすく解説します。

date関数の基本の使い方

date関数は、指定したフォーマットで現在の日付や時刻を取得するために使われます。基本的な構文は以下の通りです。

1
echo date('Y-m-d H:i:s');

このコードは、現在の年(Y)、月(m)、日(d)、時(H)、分(i)、秒(s)を表示します。
例えば、“2023-11-11 12:00:00"のような形式です。

フォーマット指定子

date関数では、さまざまなフォーマット指定子を使用できます。

指定子には下記のものがあります。

日付に関するフォーマット指定子

d - 日。2桁の数字(先頭にゼロが付く場合あり)。
D - 曜日のテキスト表記、3文字。
j - 日。先頭にゼロをつけない。
l (小文字の’L’) - 曜日のフルテキスト表記。
N - ISO-8601 形式の、曜日の数値表現(1(月曜日)から 7(日曜日))。
S - 英語形式の序数を表すサフィックス。2文字。
w - 曜日の数値表現(0(日曜)から 6(土曜))。
z - 年の中の日。0 から 365。
W - ISO-8601 週番号。
F - 月のフルテキスト表記。
m - 月。数字。2桁の数字(先頭にゼロが付く場合あり)。
M - 月のテキスト表記、3文字。
n - 月。数字。先頭にゼロをつけない。
t - 指定された月の日数。
L - 閏年かどうか。1なら閏年、0なら閏年ではない。
o - ISO-8601 年数。
Y - 年。4桁の数字。
y - 年。2桁の数字。

時刻に関するフォーマット指定子

a - 午前または午後(小文字)。
A - 午前または午後(大文字)。
B - スウォッチ インターネット時間。
g - 時。12時間単位。先頭にゼロをつけない。
G - 時。24時間単位。先頭にゼロをつけない。
h - 時。12時間単位。2桁の数字(先頭にゼロが付く場合あり)。
H - 時。24時間単位。2桁の数字(先頭にゼロが付く場合あり)。
i - 分。2桁の数字(先頭にゼロが付く場合あり)。
s - 秒。2桁の数字(先頭にゼロが付く場合あり)。
v - ミリ秒。3桁の数字。
u - マイクロ秒。date()では常に000000を返す。
タイムゾーンに関するフォーマット指定子
e - タイムゾーン識別子。
I (大文字の’i’) - サマータイム中かどうか。1ならサマータイム、0ならそうではない。
O - グリニッジ標準時 (GMT) からの時差。
P - GMTからの時差。コロンで区切られた形式。
T - タイムゾーンの略称。
Z - タイムゾーンのオフセット秒。

完全な日付/時刻

c - ISO 8601 日付(2004-02-12T15:19:21+00:00のような形式)。
r - RFC 2822 フォーマットされた日付(Thu, 21 Dec 2000 16:01:07 +0200のような形式)。
U - Unix エポック(1970年1月1日 00:00:00 GMT)からの秒数。

タイムゾーンの設定

PHPのデフォルトタイムゾーンは、php.iniファイルで設定されたものですが、date_default_timezone_set関数を使用してスクリプト内で変更することもできます。

1
2
date_default_timezone_set('Asia/Tokyo');
echo date('Y-m-d H:i:s');

様々な使い方

先頭に0がつかない日付・時刻のフォーマット例

1
echo date("Y-n-j G:i:s");

このコードは、年を4桁で、月と日を先頭に0をつけずに、時を24時間表記で先頭に0をつけずに表示します。
ただし、分と秒は先頭に0がついて2桁で表示されます(これは分と秒のフォーマット指定子が先頭の0を省略するオプションを提供していないためです)。

例えば、2024年1月5日午前9時15分09秒の場合、このコードは次のように表示されます:

1
2024-1-5 9:15:09

曜日の表示

1
echo date("l");

このコードは、現在の曜日をフルネームで表示します(例: Monday)。

日本語に変換する場合、PHPには直接日本語の曜日を取得する関数は存在しないため、マッピング用のテーブルを作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// 曜日を英語で取得
$dayOfWeek = date("l");

// 英語の曜日を日本語の曜日にマッピング
$daysInJapanese = array(
    "Monday" => "月曜日",
    "Tuesday" => "火曜日",
    "Wednesday" => "水曜日",
    "Thursday" => "木曜日",
    "Friday" => "金曜日",
    "Saturday" => "土曜日",
    "Sunday" => "日曜日",
);

// 英語の曜日を日本語の曜日に変換して表示
echo $daysInJapanese[$dayOfWeek];

このコードは、現在の曜日を英語で取得し(例:Monday)、それを$daysInJapanese配列を使用して日本語の曜日(例:月曜日)に変換して表示します。

指定された日付が何曜日かを表示

1
2
$specificDate = "2024-02-19";
echo "The day of the week: " . date("l", strtotime($specificDate));

このコードは、指定された日付(ここでは2024年2月19日)が何曜日であるかを表示します。
date()関数とstrtotime()関数を組み合わせることで、任意の日付の曜日を取得できます。

指定された年が閏年かどうかを表示

1
2
$specificYear = "2024";
echo "Is " . $specificYear . " a leap year?: " . (date("L", strtotime($specificYear . "-01-01")) ? "Yes" : "No");

このコードは、指定された年(ここでは2024年)が閏年かどうかを判定し、結果を表示します。
date("L", ...)を使用して閏年かどうかを判定し(閏年であれば1を返し、そうでなければ0を返します)、その結果に基づいて"Yes"または"No"を表示します。
閏年の判定には、任意の年の1月1日のタイムスタンプをstrtotime()関数で生成しています。

現在の月の最初と最後の日を取得

1
2
echo "First day of the month: " . date("Y-m-01") . "\n";
echo "Last day of the month: " . date("Y-m-t");

このコードは、現在の月の最初の日と最後の日を表示します。

特定の日付からX日後(または前)の日付を計算

1
2
$daysToAdd = 10;
echo date("Y-m-d", strtotime("+{$daysToAdd} days"));

または、過去の日付を計算する場合:

1
2
$daysToSubtract = 10;
echo date("Y-m-d", strtotime("-{$daysToSubtract} days"));

これらのコードは、現在の日付から指定された日数を加算または減算して、その日の日付を計算します。
特定の期間後の日付を知る必要がある場合に便利です。

時間の加算と減算

1
2
3
4
5
// 1時間加算
echo date("Y-m-d H:i:s", strtotime("+1 hour"));

// 30分減算
echo date("Y-m-d H:i:s", strtotime("-30 minutes"));

このコードは、現在の時刻に1時間を加算したり、30分を減算したりします。
スケジュールの調整や、時間ベースのリマインダーを設定する際に使用できます。

特定の期間内の日付の生成

1
2
3
4
5
6
7
$start_date = strtotime("2024-01-01");
$end_date = strtotime("2024-01-07");

while ($start_date <= $end_date) {
    echo date("Y-m-d", $start_date) . "\n";
    $start_date = strtotime("+1 day", $start_date);
}

このコードは、指定された期間(2024年1月1日から2024年1月7日まで)の各日付を表示します。
期間内のイベントリストを生成する際などに便利です。

年度の計算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$month = date("m");
$year = date("Y");

// 4月以降は次の年度
if ($month >= 4) {
    $fiscalYear = $year . "-" . ($year + 1);
} else {
    $fiscalYear = ($year - 1) . "-" . $year;
}

echo "Fiscal Year: " . $fiscalYear;

このコードは、現在の月を基にして会計年度(4月開始)を計算し、表示します。
会計や財務報告での年度計算に役立ちます。

期限までの残り日数を計算する

下記はdate関数の使い方ではないのですが、よくある使い方の一例として紹介します。
プロジェクトの締切りやイベントの日までの残り日数を計算するには、DateTimeクラスとDateIntervalクラスを利用することができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 期限の日付を設定
$deadline = new DateTime('2024-12-31');
// 現在の日付
$now = new DateTime();

// 期限までの差を計算
$diff = $now->diff($deadline);

// 残り日数を取得
$daysLeft = $diff->days;

echo "期限まで残り {$daysLeft} 日です。";

このコードでは、DateTimeオブジェクトを使用して期限の日付と現在の日付を表し、diffメソッドで2つの日付の差を計算しています。
結果はDateIntervalオブジェクトとして返され、daysプロパティを通じて残り日数を取得できます。

こちらdate関数を使っていませんが、PHPには日付と時刻を扱うためのさまざまな方法があります。
date関数はその中でも基本的でシンプルな方法の一つですが、特定の日付間の差を計算するような場合にはDateTimeクラスを使用します。
これは、DateTimeクラスが日付の加算や減算、さらには二つの日付間の期間を計算する機能を提供しているためです。
DateTimeクラスを使用することで、期限までの残り日数の計算など、より複雑な日付操作を行うことができるようになります。

特定のタイムスタンプを使用

date関数は、単に現在の日付や時刻を取得するだけでなく、特定のタイムスタンプに基づいた日付や時刻を取得するのにも使用できます。
第二引数にUnixタイムスタンプ(1970年1月1日0時0分0秒からの秒数)を渡すことで、特定の日付や時刻を取得できます。

1
echo date('Y-m-d H:i:s', 1670000000);

これは、Unixタイムスタンプ「1670000000」に相当する日付と時刻を表示します。

Q&A

システムの時刻を取得するには?

date関数はサーバーに設定されたシステム時刻を取得するものです。
よって下記のようにdate関数を呼び出すことで取得できます。

1
echo date('Y-m-d H:i:s');

現在時刻を取得するにはどうしたらいい?という質問をよく受けますが、date関数はサーバーに設定されたシステム時刻しか取得できません。
サーバーに設定された時刻が狂っていたらdate関数が返却する結果も間違ったものになります。

OSのシステム時刻を確認するには、各OSのコマンドを使用します。

LinuxおよびUnix系OS

LinuxやUnix系OSでは、dateコマンドを使用してシステム時刻を表示できます。ターミナルまたはコマンドラインから次のように入力します:

1
2
date
Sat Feb 10 14:07:09 JST 2024

PHPのdate関数と同じ名称ですね。

Windows

Windowsでは、コマンドプロンプトまたはPowerShellを使用してシステム時刻を取得できます。

コマンドプロンプトでの表示方法:

1
2
time /T
14:09

または、

1
2
date /t
2024/02/10

time /Tは現在の時刻を、date /Tは現在の日付を表示します。

PowerShellでの表示方法:

1
2
3
Get-Date

2024年2月10日 14:10:43

Get-Dateコマンドレットは、より詳細な日付と時刻の情報を表示し、フォーマットのカスタマイズも可能です。

PHPバージョンとdate関数の変遷

PHPの進化に伴い、date関数も様々な改良が加えられてきました。特に、PHP 5.2以前とPHP 5.3以降では、いくつかの重要な違いがあります。

PHP 5.2以前

  • 32ビットシステムの制限: 2038年問題に直面しているシステムでは、2038年1月19日以降の日付を正しく扱うことができません。
  • タイムゾーンの扱い: デフォルトのタイムゾーンが設定されていない場合、PHPは警告を出すことがあります。

PHP 5.3以降

  • 64ビットサポート: 2038年問題が解決され、遥か未来の日付も正確に扱えるようになりました。
  • タイムゾーンの改善: date_default_timezone_set()関数を使うことで、スクリプト内でタイムゾーンを容易に設定できるようになりました。

まとめ

この記事では、PHPのdate関数を使って日付と時刻を扱う方法について詳しく解説しました。
基本的な使い方から始め、さまざまなフォーマット指定子の使用方法、タイムゾーンの設定方法、さらにはDateTimeクラスを使ったより高度な日付と時刻の操作についても触れました。

date関数はPHPで最もよく使われる関数の一つであり、ウェブアプリケーション開発において日付や時刻の表示、ログの生成、有効期限の計算など、幅広い用途に利用されます。
今回紹介したフォーマット指定子やタイムゾーンの設定方法を理解することで、あなたのPHPプログラミングにおける日付と時刻の扱いがより柔軟で正確なものになるでしょう。

また、DateTimeクラスを使用することで、date関数だけでは対応しきれない複雑な日付計算や操作が可能になります。
特定のタイムスタンプを扱う場合や、期限までの残り日数を計算する場合など、より高度な日付操作を必要とするシナリオではDateTimeクラスの利用を検討してください。

PHPの日付と時刻の操作をマスターすることは、プロジェクトにおける多くの課題を解決する鍵となります。
この記事が、PHPにおける日付と時刻の扱い方を理解し、さらにスキルを向上させる一助となれば幸いです。

最後に、PHPの公式ドキュメントや関連するリソースを参照することで、date関数やDateTimeクラスに関する知識をさらに深めることができます。
プログラミングは常に学び続けるプロセスです。今回学んだ知識を活かして、さまざまなプロジェクトに挑戦してみてください。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア