2009-06-13 4 views
7

私はそれが$ENV{TZ}のように単純だと仮定していましたが、TZ環境変数は設定されていませんが、まだ私はEDTにいるということをまだ知っていますので、(chomp(my $tz = qx/date +%Z/);以外の) 。マシンがPerlで設定されている現在のタイムゾーンを特定するにはどうすればよいですか?

+0

私のシステムでは、タイムゾーンは/ etc/localtimeファイルで規制されています。libcはその使用方法を知っているようです。 –

答えて

14
use POSIX; 
print strftime("%Z", localtime()), "\n"; 
+0

私は%Zについて考えましたが、いくつかのシステムでは動作しないことを覚えています。 –

+0

man strftimeによると、%Zは標準仕様であり、すべてのプラットフォームでサポートされる必要があります。 –

+1

私はこれをPOSIXのドキュメントから覚えていたと思います。タイムゾーンの名前が非標準であるため、 "Z"指定子はあまり知られていません。数値指定子に従うのが最も安全なルートです。しかし、これはおそらく私の目的のために十分安全だと思います。 –

5
use POSIX; 
localtime(); 
my ($std, $dst) = POSIX::tzname(); 

tzname()グローバルtzname POSIXへのアクセスを提供します - しかし、それは最初の場所に設定するために、あなたはlocaltime()と呼ばれている必要があります。

6

あなたがPOSIXよりポータブル(おそらくはるかに遅い)何かをしたい場合は、日時を使用することができます::このためのタイムゾーン:たぶん

use DateTime::TimeZone; 

print DateTime::TimeZone->new(name => 'local')->name(); 
1

速く、この:

my @lt = localtime(12*60*60); 
my @gt = gmtime(12*60*60); 
$tz = @lt[2] - @gt[2]; 
$tz_ = sprintf("%+03d:00", $tz); # for +02:00 format 
+0

回答を補完するには、[編集](http://stackoverflow.com/posts/29400576/edit)ボタンを使用します。 – ZygD

0

あなただけが必要な場合+05:30(UTC + 5.5 /インド時間)のように、次のコードを使用することができます。

my @lt = localtime(); 
my @gt = gmtime(); 

my $hour_diff = $lt[2] - $gt[2]; 
my $min_diff = $lt[1] - $gt[1]; 

my $total_diff = $hour_diff * 60 + $min_diff; 
my $hour = int($total_diff/60); 
my $min = abs($total_diff - $hour * 60); 

print sprintf("%+03d:%02d", $hour, $min); 

この回答は上記のPavelの答えに触発されています。

関連する問題