2009-06-13 61 views
7

我以爲它會像$ENV{TZ}一樣簡單,但是沒有設置TZ環境變量,但date命令仍然知道我在EDT,所以必須有其他方式來確定時區(除了說chomp(my $tz = qx/date +%Z/);) 。如何確定機器設置爲使用Perl的當前時區?

+0

只需要額外的信息,在我的系統中,時區由文件/ etc/localtime調節,libc似乎知道如何使用它。 – 2009-06-13 06:51:04

回答

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

我曾想過%Z,但我記得它在某些系統上不工作。 – 2009-06-13 03:24:30

+0

根據man strftime,%Z是標準規範,應該在所有平臺上支持。 – 2009-06-13 03:35:15

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

tzname(),您可以訪問到POSIX全球tzname - 但你需要呼籲localtime()爲它擺在首位設置。

6

如果你想要的東西比POSIX更便攜(但可能慢得多),你可以使用的DateTime :: TimeZone的這個:

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

如果你只需要類似+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上述答案的啓發。

相關問題