海外サーバーでの日本時間の表し方

CGIテクニック集トップへ





概要

海外サーバーなどで日本時間以外のサーバーを利用しながらファイル更新時間等を日本時間で表します。当サイトのほとんどのCGIで利用されています。

必用な処理

  1. ファイルの変更時間属性を取得する
  2. 変更時間属性を時刻情報に変換する
  3. 日付時間情報として表示する

サンプルコード

 my $offset_from_gmt = 9;
 my $mtime = (stat("$file"))[9];
 my ($min,$hour,$mday,$mon,$year) = 
         (gmtime($mtime+$offset_from_gmt*3600))[1 .. 5];
 printf("%s年%s月%s日%02s時%02s分",$year+1900,$mon+1,$mday,$hour,$min);

コードの解説

 my $offset_from_gmt = 9;

GMTからのオフセットを設定します。日本時間の場合は+9時間なので9になります。マイナスの場合も-17などそのまま設定できます。

 my $mtime = (stat("$file"))[9];

$fileは時間を取得したいファイル。stat関数によりそのファイルの属性を配列にて取得することができます。statが返す配列の10番目の要素(0から始まる要素番号9)が更新時間情報なのでそれを$mtimeに格納する。他の返り値は捨てています。時間はepochなので1970年1月1日0時0分0秒からの秒数になります。

他のstatの返り値は、

 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,
     $mtime,$ctime,$blksize,$blocks)=stat("$file");

のようになります。この場合アクセス時間は$atime, inode変更時間は$ctimeに格納されます。$sizeによりファイルサイズも取得できます。

 my ($min,$hour,$mday,$mon,$year) = 
         (gmtime($mtime+$offset_from_gmt*3600))[1 .. 5];

ファイルの変更時間にオフセット時間をプラスしてgmtime関数にて時刻情報に変更します。$offset_from_gmtは時間数なので秒数に変換するために3600を掛けます。gmtimeはlocaltimeと同様に配列を返します。返り値の2番目から6番目(要素番号1から5)がそれぞれ分、時、日、月、年のの情報になります。この例では他の返り値は捨てています。

localtime関数でサーバー時間そのままを取得するにはファイルの更新時間を表示を参照してください。

全ての返り値を受け取るには、

 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
         (gmtime($mtime+$offset_from_gmt*3600))[1 .. 5];

のようにすることができます。

 printf("%s年%s月%s日%02s時%02s分",$year+1900,$mon+1,$mday,$hour,$min)

時刻情報を好みのフォーマットで出力します。年情報$yearは1900年が0なので+1900します。月情報は1月が0, 12月が11なので+1します。

関連するCGIテクニック

カレンダーの作り方
Date::Calcを使ったカレンダーの作り方
月の日数をチェックする方法