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