GMTの有効利用
そふぃのPHP入門 >> PHP実践リファレンス >> 日付・時刻処理 >> GMTの有効利用

GMTの有効利用

GMTとUTC

GMTとはイギリスのグリニッジ天文台での天体観測によって決められる時刻の事で、グリニッジ標準時です。昔は世界標準時刻として使われていましたが、現在ではUTC(世界協定時)が世界標準時として採用されています。

両者はほとんど同じ時刻を指しますが、天文学を主体としたGMTでは、海の潮汐運動のおかげで地球の自転周期が年々長くなっているため、時間の経過と共にずれが生じるそうです。

これに対しUTCではセシウム133とかいう原子が93億9263万1770回振動する時間というよく分からんもんを原子時計を使って計測しています。

天文学のGMTに物理学のUTCってところでしょうか。ちなみにGMTとUTCのずれは100年で約18秒ずれるそうです。

UTCの計算方法はGMTに合わせる形で設定されており、GMTとの差が0.8秒以上になったら閏秒という、うるう年の秒数バージョンを追加して差をなくすそうです。ちなみにこの閏秒が挿入されるペースは約1年に1回程度だそうです。

日付・時刻を書式化しGMTで取得する―gmdate関数

日付・時刻をフォーマットした上にGMTに直してくれるのがgmdate()関数です。

使い方はタイムスタンプの整形1で紹介したdate()関数の使用方法と丸っきり一緒で、フォーマット文字なども同一の物を使います。両者の違いは、gmdate()関数は返される値がGMTというだけです。

参考関数

  • gmdate() ---- 日付・時刻を書式化しGMTの日付で取得する

書式

  • string gmdate( string format [, int timestamp ] )

第1引数にフォーマット文字、第2引数にタイムスタンプを指定します。第2引数を省略した場合は現在時刻が適用されます。

日本時間とGMT

  1. <?php
  2. // 現在時刻を表示したいので、date・gmdate共に第2引数を省略します。
  3. echo "JPN:".date("Y/m/d H:i:s")."<br />\n";
  4. echo "GMT:".gmdate("Y/m/d H:i:s");
  5. ?>

出力結果

JPN:2017/04/28 01:42:37
GMT:2017/04/27 16:42:37

グリニッジ標準時(イギリス)と日本の時差表示が簡単にできます。

GMTの有効利用

gmdate()関数を使うと、PHPでGMTを簡単に取得する事ができます。日本の場合GMTよりも9時間先行しているのでGMT+9時間というのが日本の時刻になります。このような地域によっての時刻をタイムゾーンと言い、日本の「+9時間」というタイムゾーンは"+0900"という表記で表わされます。

わざわざGMTを使う必要はなさそうなもんですが、今までに紹介したdate()関数やtime()関数、mktime()関数ではサーバ内部の時計からタイムスタンプを生成している為、サーバ内の時計がアメリカのタイムゾーンに合わせてあればタイムスタンプもアメリカの時刻になります。

この問題をGMTを使用する事によって回避するわけです。どのタイムゾーンであろうと「GMT+9時間」という日時は「日本」を表わすため、何かの弾みで海外に引っ越したり、乗り換えたレンタルサーバが海外のタイムゾーンに時計を合わせてたり(海外にサーバを置いてるトコもあるし・・)してもGMTを使用していればスクリプトの書き換えは必要なくなります。

このような性質のため、サンプルスクリプトを配布されているようなサイトでは不特定のユーザに対応できるようにGMTを使用して記述されている事が多いです。

さて、gmdate()関数を使用した場合、サーバの設定がどのタイムゾーンであってもGMTという同じ時刻が返ってくるので便利ですが、この場合、日本時間を表示したいなら+9時間という計算をしてやらなくてはなりません。

+9時間という時間をタイムスタンプに直すと32400秒になります。タイムスタンプ値は単位が「秒」なので9時間分の秒数を足してやればいい訳です。素直に+32400してもいいのですが以下のような書かれ方も良く見かけます。

  1. time() + 9 * 60 * 60; // 時間数 * 分数 * 秒数
  2. time() + 9 * 3600; // 時間数 * 分×秒数
  3. time() + 32400; // オフセット秒数

32400のように時差を秒数で表わしたものをオフセット秒数と言い、

  1. date('Z'); // タイムゾーンのオフセット秒数を得る

でも取得できます。つまり、日本のオフセット秒数は"+32400"となるわけです。

今回は時間の計算でしたが、これが日数であっても、秒数の計算で目的の日にちを求めたりする記述方法は良く使われているので覚えておいて下さい。

GMTで指定した日付のタイムスタンプを取得―gmmktime関数

gmmktime()関数は指定した日付のタイムスタンプを取得する関数ですが、指定する引数がGMTの数値になり、タイムゾーンの設定に合わせたタイムスタンプが返されます。つまり、GMTからタイムゾーンのタイムスタンプに戻してくれる関数です。

と、言ってもあまり難しく考える事はなく、タイムスタンプと現在時刻の取得で紹介したmktime()関数のGMTバージョンだというだけです。使用方法もmktime()関数と丸っきり同じです。

参考関数

  • gmmktime() ---- GMTで指定した日時のUNIXタイムスタンプを取得する

書式

  • int gmmktime( [ int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst ]]]]]]] )

サマータイム引数はPHP5.1.0で廃止されました。

という事でgmmktime()関数の使用方法の一例はこのようになります。

gmmktime()の使用例

  1. <?php
  2. //フォーマット文字を使用して、現在時刻の各値をGMTとして取得
  3. $hour = gmdate("H");
  4. $minute = gmdate("i");
  5. $second = gmdate("s");
  6. $month = gmdate("n");
  7. $day = gmdate("j");
  8. $year = gmdate("Y");
  9.  
  10. // タイムスタンプを生成
  11. $timestamp[] = gmmktime($hour, $minute, $second, $month, $day, $year);
  12. $timestamp[] = mktime($hour, $minute, $second, $month, $day, $year);
  13.  
  14. echo "現在時刻:".date("Y/m/d H:i:s", time())."<br />\n";
  15. echo "gmmktime:".date("Y/m/d H:i:s", $timestamp[0])."<br />\n";
  16. echo "mktime:".date("Y/m/d H:i:s", $timestamp[1]);
  17. ?>

出力結果

現在時刻:2017/04/28 01:42:37
gmmktime:2017/04/28 01:42:37
mktime:2017/04/27 16:42:37