今回は、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 件のコメント:
コメントを投稿