【PHP8.x】gmdate関数の使い方
gmdate関数は、指定されたタイムスタンプをGMT(グリニッジ標準時)でフォーマットされた日付文字列として返す関数です。date関数と似ていますが、gmdate関数は常にGMT時間を使用する点が異なります。これは、サーバーのタイムゾーン設定に関係なく、一貫した日時情報を必要とする場合に非常に役立ちます。
この関数は、2つの引数を取ります。1つ目は必須のフォーマット文字列で、strftime関数と同様の書式指定子を使用して、出力される日付文字列の形式を定義します。例えば、'Y-m-d H:i:s'というフォーマット文字列を使用すると、'2024-10-27 10:30:00'のような形式で日付と時刻が出力されます。2つ目の引数はオプションのタイムスタンプです。タイムスタンプが指定されない場合、関数は現在のGMT時間を使用します。タイムスタンプはUnixタイムスタンプ(1970年1月1日からの秒数)として指定する必要があります。
gmdate関数は、ウェブアプリケーションやAPIなどで、タイムゾーンに依存しない日時情報を扱う際に頻繁に使用されます。特に、複数の地域でサービスを提供する場合や、データベースにGMTで日時を保存する場合に、その有用性が発揮されます。例えば、世界中のユーザーに同じタイムゾーンでイベントの開始時刻を表示する場合などに利用できます。date関数とgmdate関数を適切に使い分けることで、タイムゾーンに関する問題を回避し、より正確な日時情報を扱うことが可能になります。
基本的な使い方
構文(syntax)
<?php
echo gmdate("Y-m-d H:i:s");
引数(parameters)
string $format, ?int $timestamp = null
- string $format: 取得する日付と時刻のフォーマットを指定する文字列
- ?int $timestamp = null: タイムスタンプを指定する整数。指定しない場合は現在のUTC時刻が使用されます。
戻り値(return)
string
指定されたフォーマットでPHPのgmdate
関数の戻り値の説明を生成します。
指定されたフォーマットに沿って、PHP 8.4.12のgmdate
関数の戻り値の説明を以下に示します。
gmdate関数は、指定されたフォーマットに従って、協定世界時 (UTC) でフォーマットされた日付と時刻を表す文字列を返します。
サンプルコード
PHP gmdateで1日後のGMT日時を取得する
<?php
/**
* 現在のGMT日時と、そこから1日加算したGMT日時を表示するサンプルコード。
*
* gmdate関数はUNIXタイムスタンプをGMT(グリニッジ標準時)としてフォーマットします。
* strtotime関数は、人間が読める形式の日付/時刻の文字列をUNIXタイムスタンプに変換、
* または既存のタイムスタンプに基づいて相対的な日付/時刻を計算するのに使われます。
*/
// 現在のGMT日時を表すUNIXタイムスタンプを取得
// time()関数は常にUTC(協定世界時)のUNIXタイムスタンプを返します。
$currentGmtTimestamp = time();
// 現在のUNIXタイムスタンプから1日後のタイムスタンプを計算
// strtotime('+1 day', $timestamp) は、指定されたタイムスタンプから1日後のタイムスタンプを返します。
$nextDayGmtTimestamp = strtotime('+1 day', $currentGmtTimestamp);
// gmdate関数のフォーマット文字列を定義
// 'Y-m-d H:i:s T' は、例として「年-月-日 時:分:秒 タイムゾーン略称」の形式を表します。
$format = 'Y-m-d H:i:s T';
// 現在のGMT日時をフォーマットして出力
echo "現在のGMT日時: " . gmdate($format, $currentGmtTimestamp) . "\n";
// 1日後のGMT日時をフォーマットして出力
echo "1日後のGMT日時: " . gmdate($format, $nextDayGmtTimestamp) . "\n";
?>
PHPのgmdate
関数は、UNIXタイムスタンプをGMT(グリニッジ標準時)として指定された形式の文字列に変換して返します。この関数を使うことで、タイムゾーンの影響を受けずに世界標準時(UTC)の正確な日時情報を扱えます。
サンプルコードでは、まずtime()
関数で現在のUTC(協定世界時)におけるUNIXタイムスタンプを取得します。UNIXタイムスタンプは、1970年1月1日0時0分0秒UTCからの経過秒数を表す数値です。次に、strtotime()
関数を使い、この現在のタイムスタンプから「1日後」の日時を計算し、そのUNIXタイムスタンプを取得しています。strtotime()
は、人間が読める形式の文字列からタイムスタンプを生成したり、既存のタイムスタンプに相対的な時間(例: +1 day
)を加算したりするのに便利です。
gmdate
関数は、第一引数に日付や時刻の出力形式を指定する$format
文字列を受け取ります。例えば、'Y-m-d H:i:s T'
は「年-月-日 時:分:秒 タイムゾーン略称」という形式を意味します。第二引数には、フォーマットしたいUNIXタイムスタンプを渡します。この引数は省略可能で、省略された場合は現在のUNIXタイムスタンプが使用されます。この関数は、指定された$format
と$timestamp
に基づき、フォーマットされたGMT日時を表す文字列を戻り値として返します。
このコードは、現在のGMT日時と1日後のGMT日時を、それぞれgmdate
関数でフォーマットし、画面に出力する例です。
gmdate
関数は、UNIXタイムスタンプを常にGMT(グリニッジ標準時)としてフォーマットします。PHPの設定やサーバーのタイムゾーンの影響を受けないため、日本時間などローカルタイムゾーンの日時を表示したい場合は、date()
関数やDateTime
クラスを利用し、適切なタイムゾーンを設定する必要があります。サンプルコードでフォーマット文字列にT
(タイムゾーン略称)を含めても、gmdate
では常にGMT
と表示される点に注意してください。この関数は、システム間の連携やログ記録など、世界共通の時刻基準で扱いたい場合に非常に有用ですし、日時操作の柔軟性を高めるため、将来的にはDateTime
クラス群の学習もおすすめします。
PHP gmdateでGMT時刻をフォーマットする
<?php
/**
* 現在の時刻をGMT(グリニッジ標準時)で指定されたフォーマットで表示します。
*
* @return string GMT時刻をフォーマットした文字列
*/
function displayCurrentGMTTime(): string
{
// フォーマットを指定 (例: 年-月-日 時:分:秒)
$format = 'Y-m-d H:i:s';
// gmdate() 関数を使用してGMT時刻を取得し、指定されたフォーマットで整形
$gmtTime = gmdate($format);
return "現在のGMT時刻: " . $gmtTime;
}
// 関数を実行して結果を表示
echo displayCurrentGMTTime();
?>
PHPのgmdate
関数は、GMT(グリニッジ標準時)で日付と時刻をフォーマットするための関数です。この関数を使うことで、世界標準時を基準とした日時情報を簡単に取得し、様々な形式で表示できます。
gmdate
関数は、第一引数にstring $format
を取り、日付と時刻のフォーマットを指定します。フォーマット文字列は、date
関数と同様の書式指定子を使用します(例:Y
は年、m
は月、d
は日など)。第二引数には、オプションで?int $timestamp
を指定できます。これは、フォーマットしたいUnixタイムスタンプを表します。省略された場合は、現在の時刻が使用されます。
戻り値はstring
型で、指定されたフォーマットに従って整形されたGMT時刻の文字列です。
サンプルコードでは、displayCurrentGMTTime
関数内でgmdate
関数を使用しています。まず、フォーマット文字列'Y-m-d H:i:s'
を変数$format
に設定し、gmdate($format)
を呼び出して現在のGMT時刻を指定された形式で取得します。取得したGMT時刻は変数$gmtTime
に格納され、"現在のGMT時刻: " という文字列と連結されて返されます。最後に、echo displayCurrentGMTTime()
で関数を実行し、結果を画面に出力します。この例では、現在のGMT時刻が「年-月-日 時:分:秒」の形式で表示されます。gmdate
関数を利用することで、タイムゾーンに依存しない日時情報を確実に取得し、システムやアプリケーションで活用することができます。
gmdate()
関数は、タイムゾーン設定に影響されず常にGMT(グリニッジ標準時)で日時を返します。ローカルタイムゾーンの日時が欲しい場合はdate()
関数を使用してください。format
引数には、PHPがサポートする日付フォーマット文字列を指定します。timestamp
引数を省略すると、現在の時刻が使用されます。format
文字列を間違えると、予期しない結果になる可能性があるため、PHPのマニュアルで正しいフォーマットを確認してください。gmdate()
は文字列を返すため、数値として比較する場合はキャストが必要です。
PHP gmdateでミリ秒精度の日時を取得する
<?php
/**
* 現在のUTC日時をミリ秒精度で取得します。
*
* gmdate関数自体はミリ秒を直接サポートしませんが、
* この関数ではmicrotime()と組み合わせてミリ秒精度を実現します。
* フォーマット文字列の末尾に '.v' を追加することでミリ秒が表示されます。
* 例: 'Y-m-d H:i:s.v'
*
* @param string $format フォーマット文字列。'.v' でミリ秒を表示します。
* @return string フォーマットされたUTC日時文字列。
*/
function getUtcTimeWithMilliseconds(string $format = 'Y-m-d H:i:s.v'): string
{
// 現在のUNIXタイムスタンプを浮動小数点数(秒.ミリ秒)で取得
$microtime = microtime(true);
// タイムスタンプの整数部(秒)と小数部(ミリ秒)を分離
$seconds = floor($microtime);
$milliseconds = round(($microtime - $seconds) * 1000);
// gmdate関数で秒までのUTC日時をフォーマット
// '.v' はgmdateでは認識されないため、それを取り除いたフォーマットで処理
$baseFormat = str_replace('.v', '', $format);
$gmdateString = gmdate($baseFormat, $seconds);
// フォーマット文字列に '.v' が含まれていればミリ秒を追加
if (strpos($format, '.v') !== false) {
// ミリ秒を3桁のゼロ埋め文字列にフォーマット
$millisecondsFormatted = sprintf('%03d', $milliseconds);
return $gmdateString . '.' . $millisecondsFormatted;
}
return $gmdateString;
}
// --- サンプルコードの使用例 ---
// 現在のUTC日時をミリ秒精度で取得し表示
echo getUtcTimeWithMilliseconds() . " UTC\n";
// 別のフォーマットで時刻のみをミリ秒精度で取得し表示
echo getUtcTimeWithMilliseconds('H:i:s.v') . " UTC\n";
// ミリ秒を含まない通常のgmdateの動作を確認
echo getUtcTimeWithMilliseconds('Y/m/d H:i:s') . " UTC\n";
PHPのgmdate
関数は、指定されたUNIXタイムスタンプ、または現在の時刻を、UTC(協定世界時)としてフォーマットする際に使用されます。第一引数$format
で日時文字列の表示形式を、第二引数$timestamp
で対象のタイムスタンプを指定します(省略時は現在時刻が使われます)。この関数はフォーマットされた日時文字列を返します。
gmdate
関数自体はミリ秒を直接サポートしていませんが、提示されたサンプルコードでは、getUtcTimeWithMilliseconds
関数を定義し、microtime()
関数と組み合わせることでミリ秒精度でのUTC日時取得を実現しています。
getUtcTimeWithMilliseconds
関数は、まずmicrotime(true)
で現在のUNIXタイムスタンプを浮動小数点数(秒.ミリ秒)として取得します。次に、その値から秒とミリ秒を分離し、gmdate
で秒までの日時をフォーマットします。その後、分離したミリ秒を別途計算し、フォーマット文字列に.v
が含まれていれば、最終的な日時文字列にミリ秒を結合して返します。これにより、通常のgmdate
では取得できないミリ秒単位での詳細な時間情報が得られるため、システムログの記録や高精度な時間計測などに役立ちます。
gmdate
関数は標準でミリ秒を直接サポートしません。本サンプルコードはmicrotime()
を用いてミリ秒を独自に計算し、gmdate
で取得した秒単位のUTC日時に文字列として付加しています。
フォーマット文字列の.v
は、PHP標準のgmdate
では認識されないカスタム記号です。これは本関数がミリ秒を追加するためのものであり、DateTime::format
などの他のPHP日付関数における.v
の動作とは異なるため、混同しないよう注意してください。
この関数は、現在のUTC時刻をミリ秒精度で取得することに特化しています。microtime()
が提供するミリ秒の精度は、実行環境のシステムに依存する場合があります。
gmdateとdateの違いを比較する
<?php
/**
* gmdate() と date() の違いを示すサンプルコード
*
* gmdate() は UTC (Coordinated Universal Time) を基準に日付をフォーマットします。
* date() はサーバーのタイムゾーン設定を基準に日付をフォーマットします。
*/
// 現在のタイムスタンプを取得
$timestamp = time();
// UTC (GMT) で日付をフォーマット
$gmdate_string = gmdate("Y-m-d H:i:s", $timestamp);
// サーバーのタイムゾーンで日付をフォーマット
$date_string = date("Y-m-d H:i:s", $timestamp);
// 結果を表示
echo "gmdate (UTC): " . $gmdate_string . PHP_EOL;
echo "date (Server timezone): " . $date_string . PHP_EOL;
?>
PHPのgmdate
関数は、指定された書式に従って日付と時刻の文字列を生成する関数です。この関数の最大の特徴は、協定世界時 (UTC)、またはグリニッジ標準時 (GMT) を基準に時刻を扱う点にあります。そのため、サーバーのタイムゾーン設定に影響されずに、常に世界共通の時刻を取得したい場合に使用されます。よく似たdate
関数はサーバーのローカルタイムゾーンを基準にするため実行環境によって結果が異なりますが、gmdate
はどのサーバーで実行しても同じUTC時刻を返します。
gmdate
関数は2つの引数を取ります。第1引数の$format
には、「Y-m-d H:i:s」のように出力したい日付や時刻の書式を文字列で指定します。第2引数の$timestamp
には、フォーマットの基準となるUNIXタイムスタンプ(1970年1月1日からの経過秒数)を整数で指定します。この引数を省略した場合は、現在の時刻が自動的に使用されます。戻り値として、指定した書式でフォーマットされた日付/時刻の文字列が返されます。
サンプルコードでは、gmdate
とdate
に同じタイムスタンプを渡し、それぞれの結果を表示しています。これにより、gmdate
がUTCの時刻を、date
がサーバーのタイムゾーンに基づいた時刻を出力するという違いを明確に確認できます。
gmdate()
関数とdate()
関数の違いは、基準となるタイムゾーンです。gmdate()
は常にUTC(協定世界時)を基準に日付をフォーマットしますが、date()
はサーバーに設定されたタイムゾーンを基準にします。タイムゾーンの設定がUTCと異なる場合、出力結果にずれが生じるため注意が必要です。タイムスタンプを省略すると現在時刻が使用されます。タイムスタンプには整数型を指定してください。日付フォーマット文字列(第一引数)はPHPが解釈できる形式である必要があります。不適切なフォーマット文字列を指定すると、期待通りの結果が得られない可能性があります。date()
関数のタイムゾーンはdate_default_timezone_set()
関数で変更可能です。