Pages

2017年3月9日木曜日

UNIXTIMEを扱う上でのPHPとPostgreSQLのタイムゾーン情報指定

 どうも、こんにちは。

 今回は、UNIXTIMEを扱う上でのPHPとPostgreSQLのタイムゾーン情報の指定について学習したことを記述します。

 タイムゾーンは同じ標準時を利用する地域や区分のことで、原子時計を元に修正定義されたUTCが現在の世界標準時となっています。有名なイギリスのグリニッジ天文台を標準とするGMTは地球の潮汐作用により自転速度が劣化することから、世界標準時にはなっていません。

 日本はUTCにくらべ9時間ほど遅いため、UNIXTIMEのようなUTCを基準にした時間表現では本来の時間より9時間ずれた情報が取得されてしまうことがあります。

 これを防ぐためには、タイムゾーンの情報を任意のプログラムに指定できる必要があります。

 PHPにおいてそれを行うのが、date_default_timezone_set関数です。

 この関数を使用することにより、例えば次のようなプログラムを実行することができます。

echo date('Y-m-d G:i:s',time());

 デフォルトのタイムゾーンがUTCになっている場合、日本で上記のプログラムを実行すると、現在時刻より9時間前の時間を取得してしまいます。

そこで、date_default_timezone_set関数でタイムゾーンを日本のものにしてみます。

date_default_timezone_set(Asia/Tokyo);
echo date('Y-m-d G:i:s',time());

 こうすると、現在時刻を取得できます。

 関数のかっこ内のパラメータには、タイムゾーンの標準となる場所を指定します。これは、PHPマニュアルサイトの「サポートされるタイムゾーンのリスト」から確認できます。

 PostgreSQLの場合には、AT TIME ZONE構文を利用します。

SELECT TO_TIMESTAMP(1489066731);

 タイムゾーンの設定が日本になっている場合、上記のSELECT文を実行すると以下のようになります。

      to_timestamp      
------------------------

 2017-03-09 22:38:51+09

 +9というのは、UTCより9時間プラスされている、ということです。現在時刻のUNIXTIME値が1489066731の場合、9時間遅い時間が取得されてしまっていることになります。
 AT TIME ZONEで、タイムゾーンをUTCに変更します。

SELECT TO_TIMESTAMP(1489066731) AT TIME ZONE('UTC');

 これを実行すると、以下のようになります。

     timezone       
---------------------

 2017-03-09 13:38:51

 先ほどよりも、9時間早い時間を取得できました。

 このように、タイムゾーン情報を指定することで、UNIXTIME時間などの取り扱いがスムーズになります。



0 件のコメント:

コメントを投稿