2009-06-13 5 views
7

Założono, że będzie to tak proste jak $ENV{TZ}, ale zmienna środowiskowa TZ nie jest ustawiona, a jednak komenda nadal wie, że jestem w EDT, więc musi być jakiś inny sposób określania strefy czasowej (inne niż powiedzenie chomp(my $tz = qx/date +%Z/);) .Jak określić bieżącą strefę czasową, w której maszyna jest ustawiona za pomocą Perla?

+0

Dla dodatkowych informacji w moim systemie strefa czasowa jest regulowana przez plik/etc/localtime, a libc wydaje się wiedzieć, jak tego użyć. –

Odpowiedz

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

Myślałem o% Z, ale pamiętam coś o tym nie działa na niektórych systemach. –

+0

Według mężczyzny strftime% Z jest standardową specyfikacją i powinno być obsługiwane na wszystkich platformach. –

+1

Myślę, że pamiętałem to z dokumentów POSIX: Specyfikator "Z" jest notportalnie nieprzenośny, ponieważ nazwy stref czasowych są niestandardowe. Trzymanie się numerycznych specyfikatorów jest najbezpieczniejszą drogą. Ale myślę, że jest to prawdopodobnie wystarczająco bezpieczne dla moich celów. –

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

tzname() daje dostęp do globalnej tzname POSIX - ale trzeba nazwali localtime() aby była ona ustawiona w pierwszej kolejności.

6

Jeśli chcesz coś bardziej mobilny niż POSIX (ale prawdopodobnie znacznie wolniej) można użyć DateTime :: TimeZone w tym:

use DateTime::TimeZone; 

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

Może tym szybciej:

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

Aby uzupełnić odpowiedź, możesz użyć przycisku [edytuj] (http://stackoverflow.com/posts/29400576/edit). – ZygD

0

Jeśli wystarczy coś jak +05:30 (UTC + 5,5/czas Indie), możesz użyć następującego kodu.

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); 

Ta odpowiedź jest inspirowana powyższą odpowiedzią Pavela.

Powiązane problemy