• ベストアンサー

perlで時差の取得

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

  • Perl
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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が返るはずです。

titokani
質問者

お礼

なるほど、わかりました。 でも、機能も多そうなモジュールではあるのですが、時差の取得のためだけにインストールするには、あまりメリットがなさそうです。 あまり必要モジュールを増やしたくないので、今回は、 use Time::Local; my $now=time(); my $off=(timegm(localtime($now))-timegm(gmtime($now)))/60; この方法でいこうと思います。 いろいろとどうもありがとうございました。

その他の回答 (2)

回答No.2

http://d.hatena.ne.jp/perlcodesample/20081029/1225581527 http://d.hatena.ne.jp/perlcodesample/20081120/1227367005 http://d.hatena.ne.jp/perlcodesample/20081119/1227022073 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さんはどういった環境でスクリプトを動かそうとしているのでしょうか。 モジュールのインストールが難しい環境にあるのですか?

titokani
質問者

補足

ありがとうございます。 取得したいのは、ローカルタイムではなく、時差なのです。 また、自分のマシンですが、まあ、日本以外に置くことはありえないと思いますが、明示的に指定したくはないのです。 なので、せいぜい環境変数TZを参照する程度で、自マシンの時差を取得したいというのが希望です。 >ところでtitokaniさんはどういった環境でスクリプトを動かそうとしているのでしょうか。 >モジュールのインストールが難しい環境にあるのですか? webサーバーで動かすことを考えています。 モジュールのインストールも可能ですが、クラッシュなどに備えて、なるべく追加のモジュールは減らしておきたいのです。 実際のところ、DateTimeを使っても、UTCとの差分を取るしかないのであれば、Time::Local、gmtime、localtimeで行うのと変わらないかとも思われるのですが、なにか利点はありますでしょうか?

回答No.1

何処と何処の時差ですか? 海外サーバと日本の時差とかでしょうか。 とりあえず時差はDateTimeというモジュールを使えば求めることができます。 http://iandeth.dyndns.org/mt/ian/archives/000619.html

titokani
質問者

補足

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

関連するQ&A

  • システム時刻、環境変数TZの関係について

    こんにちは。 システム時刻とTZ環境変数の関係について教えてください。 環境変数TZ はAUTOECEC.BAT に「SET TZ=JST」などと記述するなどして定義することができます。ただし、定義してもタスクトレイの時刻は変わりません。 C、C++でプログラムした場合、現在時刻を得るためにCTime::GetCurrentTime などを使用すると思います。 これらのAPIでは、環境変数TZが定義されている場合は それを使用し、定義されていなけばシステム時刻を 取得するような仕様のようです。 上記のような理由から、システム時刻よりも環境変数TZが優先されるのには、理由があるのでしょうか。 また、環境変数TZが定義されている場合であっても システム時刻を取得する方法はあるのでしょうか。 よろしくお願いします。

  • PerlでIPアドレスを取得する方法

    Perl5.6 or 5.8を使っております。 環境変数からIPの取得をするのは、CGIで動いている前提?ですが、 CGIでなくてperlスクリプトが単体で動作した場合に他の例えばサーバーのアドレスを知るにはどのようにしたらよいのでしょうか? 自アドレスはgethostbyaddrで取得できます。 REMOTE_ADDRの値を取得したいです。

    • ベストアンサー
    • Perl
  • perl ftp取得したファイルの保存先設定

    perl初心者です。 FTPサーバーのLOGを取得する場合のプログラムをperlで作成しております。 保存先設定を1回(1行)設定しただけで設定先フォルダにLOGファイルが保存されるような方法はありますでしょうか? 今現在以下のように保存先を指定して取得しています。 my $local_file1 = 'C:/log/aaa.csv''; my $local_file2 = 'C:/log/bbb.csv'; my $local_file3 = 'C:/log/ccc.csv'; $ftp->get('取得元パス/aaa.csv',$local_file1); $ftp->get('取得元パス/bbb.csv',$local_file2); $ftp->get('取得元パス/ccc.csv',$local_file3); ただ、1ヶ月分のLOGを取得するとなるとmy $local_fileも$ftp->getも1ヶ月分作成しなければならないため長文のプログラムになってしまいます。 他、1ヶ月分ならFor文でこんな感じでやれば・・・というアドバイスがあればお願いいたします。

    • ベストアンサー
    • Perl
  • PERLで変数で取得した値をしりたい

    PERLで変数に取得した値がどのようなものか確認する方法を教えてください VBではMSGBOXに表示させるなど簡単な方法があったのですが、似たような方法はありますか?

    • ベストアンサー
    • Perl
  • perlで変数をunix時間から時刻表示に変換したいがうまくできない

    変数に入ったUNIX時間を下記のようなperlコマンドで普通の時刻表示に変換したいのですが、 変数がうまく展開できません。 (↓のままだと、1970年1月1日になります) 'や"や\を組み合わせたらどうにかなるかと思うのですが、どうすればいいでしょうか? #! /bin/sh UX_TIME=113423423 perl -e 'print localtime($UX_TIME) . "\n"' exit 0 以上、よろしくお願いします。

  • perlスクリプト内での時刻設定

    WindwosXPでActiveperlを使ってPerlを書いています。 現在日付をlocaltime()をつかって取得できるようですが、 逆に、perlスクリプト側からシステム日付を更新するというようなことは可能なのでしょうか? 宜しくお願いします。

  • windowsでperlの1行目を無視する。

    CGI(perl)の1行目である、#!/usr/bin/perlを読み飛ばす設定をしたいと思います。 httpd.confで ScriptInterpreterSource registry としました。 さらにレジストリで拡張子の関連付けが必要なようなのですが、それの具体的な方法がわかりません。 ご教授お願いします。 やりたい事は、ローカルとサーバーのperlのパスがことなるため、1行目を変更するのがめんどうでそれを改善したいのです。 現在は、c:\usr\bin\perl にperlをインストールして回避していますが・・・ 環境 windows2000 apache1.3.29 perl

    • ベストアンサー
    • CGI
  • Perl 時間同士の差

    恐れ入ります。 Perlを使って、時間と時間の差を求めたいのですが、 なかなかうまくいきません。 一度、txtファイルに書き込み日時を保存したあと、 それをperlにて読み込み、現在時刻との差を出して投稿制限を掛けたいのですが、 どのようにしたらよろしいでしょうか。 現在書き込み日時はtxtファイルに保存し、cgiファイル上に、出力済みで、localtimeも出力済みです。 単純に引いて関数に代入しても、正しい時間を得られません。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 情報の取得

    現在、Perlで掲示板をつくっています。投稿者のIPアドレスを取得できるようにしているのですが、IPアドレスやブラウザ情報だけでなく、プロバイダ情報なども取れるようにしたいのです。 Perlでプロバイダ情報の取得などできるのでしょうか。(環境変数では無理なようですが)どなたかお教えください。

    • ベストアンサー
    • Perl
  • Perlで日付を取得する

    Perlで日付を取得する perlで1週間分の日付を取得し、セレクトボックスに格納したいと思っています。 なるべくいま使っているサブルーチンを使いたいです。 # 現在日時を文字列化する sub get_date_string { # local(@week) = ("日", "月", "火", "水", "木", "金", "土"); local(@week) = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); $year += 1900; $mon++; # 文字列化する if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } if ($sec < 10) { $sec = "0$sec"; } $weekstr = $week[$weekday]; return "$year-$mon-$day ($weekstr) $hour:$min"; # return "$year年$mon月$day日 ($weekstr) $hour時$min分$sec秒"; } これを別のルーチンで、 $today = substr(&get_date_string,0,10); $kinou = $today - 1; $ototoi = $today - 2; として、今日の日付だけでなく、昨日、おととい、その前の日を取得したいと試みましたが、今日は取得できても、$kinouや$ototoiは、すごい数字になってしまいます。 変わりに -24*3600と引いてみましたがダメでした。 文字列に変更されていないから引けないのでしょうか? かんたんに処理できそうでできないので、詳しいやり方を教えてください。

    • ベストアンサー
    • Perl

専門家に質問してみよう