[PHP]gmmktime関数完全解説:日付と時刻操作をマスターしよう

PHP

はじめに

PHPで日付や時刻を扱う際、様々な組み込み関数が利用できますが、その中でも「gmmktime」関数は特に重要な役割を果たします。この関数はGMT(グリニッジ標準時)でのUNIXタイムスタンプを取得するために使用され、タイムゾーンを考慮した日付計算において非常に有用です。本記事では、gmmktime関数の基本から応用まで、サンプルコードを交えて詳しく解説していきます。

gmmktime関数とは?

gmmktime関数は、指定した日時のGMTベースのUNIXタイムスタンプを返す関数です。通常のmktime関数がローカルタイムゾーンを基準にするのに対し、gmmktime関数はGMT(UTC)を基準にします。

基本構文

int gmmktime(
    int $hour = date("H"),
    int $minute = date("i"),
    int $second = date("s"),
    int $month = date("n"),
    int $day = date("j"),
    int $year = date("Y")
)

各パラメータは以下の通りです:

  • $hour – 時間(0〜23)
  • $minute – 分(0〜59)
  • $second – 秒(0〜59)
  • $month – 月(1〜12)
  • $day – 日(1〜31)
  • $year – 年(4桁または2桁)

mktime関数との違い

gmmktime関数とmktime関数の最大の違いは、タイムゾーンの扱いです:

  • mktime() – サーバーのローカルタイムゾーンを基準にタイムスタンプを生成
  • gmmktime() – GMT(UTC)を基準にタイムスタンプを生成

以下の例でその違いを見てみましょう:

// タイムゾーンを東京に設定
date_default_timezone_set('Asia/Tokyo');

// 2025年1月1日 12:00:00のタイムスタンプを生成
$local_ts = mktime(12, 0, 0, 1, 1, 2025);
$gmt_ts = gmmktime(12, 0, 0, 1, 1, 2025);

echo "ローカルタイムスタンプ: " . $local_ts . "\n";
echo "GMTタイムスタンプ: " . $gmt_ts . "\n";

echo "ローカル時間: " . date('Y-m-d H:i:s', $local_ts) . "\n";
echo "GMT時間: " . gmdate('Y-m-d H:i:s', $gmt_ts) . "\n";

東京時間(UTC+9)では、同じ時刻を指定しても、gmmktime関数で得られるタイムスタンプはmktime関数より9時間分(32400秒)小さくなります。

gmmktime関数の実用例

例1:特定のGMT日時のタイムスタンプを取得

// 2025年3月15日 08:30:00 GMTのタイムスタンプを取得
$timestamp = gmmktime(8, 30, 0, 3, 15, 2025);
echo "タイムスタンプ: " . $timestamp . "\n";
echo "GMT日時: " . gmdate('Y-m-d H:i:s', $timestamp) . "\n";

例2:日付の加算・減算

// 現在から30日後のGMT日時を計算
$now = time();
$future_date = gmmktime(
    gmdate("H", $now),
    gmdate("i", $now),
    gmdate("s", $now),
    gmdate("n", $now),
    gmdate("j", $now) + 30,
    gmdate("Y", $now)
);

echo "現在のGMT日時: " . gmdate('Y-m-d H:i:s', $now) . "\n";
echo "30日後のGMT日時: " . gmdate('Y-m-d H:i:s', $future_date) . "\n";

例3:タイムゾーンをまたぐイベント管理

// 世界中の異なるタイムゾーンのユーザーが参加するオンラインイベントの時間管理
// イベント開始時間をGMTで保存
$event_start = gmmktime(15, 0, 0, 3, 20, 2025); // 2025年3月20日15:00 GMT

// 異なるタイムゾーンでの表示
$timezones = [
    'America/New_York' => 'ニューヨーク',
    'Europe/London' => 'ロンドン',
    'Asia/Tokyo' => '東京',
    'Australia/Sydney' => 'シドニー'
];

echo "グローバルイベント開始時間:" . gmdate('Y-m-d H:i:s', $event_start) . " GMT\n\n";

foreach ($timezones as $tz => $name) {
    date_default_timezone_set($tz);
    echo $name . "時間: " . date('Y-m-d H:i:s', $event_start) . "\n";
}

注意点と落とし穴

1. パラメータの順序

gmmktime関数のパラメータ順序は、多くの人が混乱しやすいポイントです。時、分、秒、月、日、年の順であることに注意しましょう。日付(月、日、年)と時刻(時、分、秒)が分かれているので覚えやすいですが、時刻が先に来ることを忘れないようにしましょう。

2. 負の値や範囲外の値の扱い

gmmktime関数の便利な点は、パラメータに負の値や範囲外の値を指定できることです。例えば:

// 2025年1月0日(つまり2024年12月31日)
$ts = gmmktime(0, 0, 0, 1, 0, 2025);
echo gmdate('Y-m-d', $ts); // 2024-12-31と表示される

// 2025年1月32日(つまり2025年2月1日)
$ts = gmmktime(0, 0, 0, 1, 32, 2025);
echo gmdate('Y-m-d', $ts); // 2025-02-01と表示される

この特性を利用すると、月末日の計算などが容易になります:

// 2025年2月の最終日を取得
$last_day_of_feb = gmmktime(0, 0, 0, 3, 0, 2025);
echo "2025年2月の最終日: " . gmdate('Y-m-d', $last_day_of_feb);

3. PHP 8.0以降の変更点

PHP 8.0以降、gmmktime関数を含む日付/時刻関数のパラメータはすべて省略可能になりました。省略された場合は現在の日時の対応する値が使用されます。以前のバージョンでは、省略されたパラメータには現在のローカルタイムが使用されていました。

まとめ

gmmktime関数は、タイムゾーンを意識したアプリケーション開発において非常に重要な役割を果たします。特にグローバルなユーザーを対象とするWebアプリケーションでは、日時の一貫した処理が求められるため、GMTベースでの時間管理は必須と言えるでしょう。

この関数をマスターすることで、複雑な日付計算や国際的なイベント管理など、様々な場面で役立てることができます。ぜひ実際のプロジェクトで活用してみてください。

// 記事の最後に役立つワンライナー
echo "現在のGMT時間: " . gmdate('Y-m-d H:i:s', time()) . "\n";
echo "1週間後のGMT時間: " . gmdate('Y-m-d H:i:s', gmmktime(
    gmdate("H"), gmdate("i"), gmdate("s"),
    gmdate("n"), gmdate("j") + 7, gmdate("Y")
)) . "\n";

以上、PHPの「gmmktime」関数について解説しました。日付と時刻の操作は多くのアプリケーション開発で必要となる基本的なスキルです。この記事が皆さんのコーディングライフに役立つことを願っています。

タイトルとURLをコピーしました