プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
perlで現在のサーバーにおける時差を取得するにはどうしたらよいのでしょうか?
ローカル時刻ではなくて、「時差」そのものを知りたいのです。
環境変数TZは設定されていますが、'Japan'となっていたりで、これだけでは時差がわかりません。
localtime(0)から求める方法もありそうですが、あまりスマートな感じがしないです。
なにか良い方法はないものでしょうか?

A 回答 (3件)

> ローカル時刻ではなくて、「時差」そのものを知りたいのです。


あ、すみません。
時差を求めるには

use DateTime;
use DateTime::TimeZone;

my $local_dt = DateTime->now(time_zone => 'local');
my $tz = DateTime::TimeZone->new(name => 'local');
print $tz->offset_for_datetime($local_dt); # => 32400

のようにすればUTC(GMT?)との時差が秒数で返ります。
日本は+9時間なので9 * 60 * 60で32400が返るはずです。
    • good
    • 0
この回答へのお礼

なるほど、わかりました。
でも、機能も多そうなモジュールではあるのですが、時差の取得のためだけにインストールするには、あまりメリットがなさそうです。

あまり必要モジュールを増やしたくないので、今回は、
use Time::Local;
my $now=time();
my $off=(timegm(localtime($now))-timegm(gmtime($now)))/60;
この方法でいこうと思います。
いろいろとどうもありがとうございました。

お礼日時:2009/05/28 15:10

http://d.hatena.ne.jp/perlcodesample/20081029/12 …
http://d.hatena.ne.jp/perlcodesample/20081120/12 …
http://d.hatena.ne.jp/perlcodesample/20081119/12 …

DateTimeは特に何も指定しなければUTCの結果が返ってきます。
なので上の例のように
my $dt = DateTime->now;
とすればUTCでの時刻が取得できますし
my $japan_dt = DateTime->now(time_zone => 'Asia/Tokyo');
とすれば日本の時刻が取得できるはずです。
また
my $local_dt = DateTime->now(time_zone => 'local');
とすると、現在のマシンのタイムゾーンにあった時刻を返してくれるのですが、
自分がこれを実行したときに、確かcygwinなどで現在のタイムゾーンを判別できなかったりすることがありました。
(今やったら判別できましたが・・・どこで見たのか忘れてしまいました--;)
なので日本の外にスクリプトを持ってかないなら
my $japan_dt = DateTime->now(time_zone => 'Asia/Tokyo');
と明示的にタイムゾーンを指定した方がいいです。
それにこの方が現在のタイムゾーンを判別する必要がなくて高速ですし。

ところでtitokaniさんはどういった環境でスクリプトを動かそうとしているのでしょうか。
モジュールのインストールが難しい環境にあるのですか?

この回答への補足

ありがとうございます。
取得したいのは、ローカルタイムではなく、時差なのです。
また、自分のマシンですが、まあ、日本以外に置くことはありえないと思いますが、明示的に指定したくはないのです。

なので、せいぜい環境変数TZを参照する程度で、自マシンの時差を取得したいというのが希望です。

>ところでtitokaniさんはどういった環境でスクリプトを動かそうとしているのでしょうか。
>モジュールのインストールが難しい環境にあるのですか?
webサーバーで動かすことを考えています。
モジュールのインストールも可能ですが、クラッシュなどに備えて、なるべく追加のモジュールは減らしておきたいのです。

実際のところ、DateTimeを使っても、UTCとの差分を取るしかないのであれば、Time::Local、gmtime、localtimeで行うのと変わらないかとも思われるのですが、なにか利点はありますでしょうか?

補足日時:2009/05/25 10:22
    • good
    • 0

何処と何処の時差ですか?


海外サーバと日本の時差とかでしょうか。

とりあえず時差はDateTimeというモジュールを使えば求めることができます。
http://iandeth.dyndns.org/mt/ian/archives/000619 …

この回答への補足

ありがとうございます。
取得したいのは、現在perlが動いているマシンのUTCとの時差です。
DateTimeですが、インストールが必要なんですね、どうしたものか・・・。

補足日時:2009/05/22 09:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!