【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日からの経過秒数)を整数で指定します。この引数を省略した場合は、現在の時刻が自動的に使用されます。戻り値として、指定した書式でフォーマットされた日付/時刻の文字列が返されます。

サンプルコードでは、gmdatedateに同じタイムスタンプを渡し、それぞれの結果を表示しています。これにより、gmdateがUTCの時刻を、dateがサーバーのタイムゾーンに基づいた時刻を出力するという違いを明確に確認できます。

gmdate()関数とdate()関数の違いは、基準となるタイムゾーンです。gmdate()は常にUTC(協定世界時)を基準に日付をフォーマットしますが、date()はサーバーに設定されたタイムゾーンを基準にします。タイムゾーンの設定がUTCと異なる場合、出力結果にずれが生じるため注意が必要です。タイムスタンプを省略すると現在時刻が使用されます。タイムスタンプには整数型を指定してください。日付フォーマット文字列(第一引数)はPHPが解釈できる形式である必要があります。不適切なフォーマット文字列を指定すると、期待通りの結果が得られない可能性があります。date()関数のタイムゾーンはdate_default_timezone_set()関数で変更可能です。

【PHP8.x】gmdate関数の使い方 | いっしー@Webエンジニア