2009-06-13 7 views
7

Avevo pensato che fosse semplice come $ENV{TZ}, ma la variabile di ambiente TZ non è impostata, eppure il comando date sa ancora che sono in EDT, quindi ci deve essere un altro modo per determinare il fuso orario (oltre a dire chomp(my $tz = qx/date +%Z/);) .Come determinare il fuso orario corrente su cui è impostata la macchina con Perl?

+0

Solo per informazioni extra, sul mio sistema, il fuso orario è regolato dal file/etc/localtime e libc sembra sapere come usarlo. –

risposta

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

Ho pensato a% Z, ma ricordo che qualcosa non funzionava su alcuni sistemi. –

+0

Secondo lo strftime man,% Z è una specifica standard e dovrebbe essere supportata su tutte le piattaforme. –

+1

Penso che stavo ricordando questo dai documenti POSIX: L'identificatore "Z" è notoriamente non portabile dato che i nomi dei fusi orari non sono standard. Attenersi agli specificatori numerici è la via più sicura. Ma penso che questo sia probabilmente abbastanza sicuro per i miei scopi. –

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

tzname() dà accesso al POSIX globale tzname - ma è necessario aver chiamato localtime() per poter essere impostato in primo luogo.

6

Se volete qualcosa di più portabile di POSIX (ma probabilmente molto più lento) è possibile utilizzare DateTime :: fuso orario per questo:

use DateTime::TimeZone; 

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

Forse questo più veloce:

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

Per completare la risposta è possibile utilizzare il pulsante [modifica] (http://stackoverflow.com/posts/29400576/edit). – ZygD

0

Se avete solo bisogno qualcosa come +05:30 (UTC + 5.5/India time), è possibile utilizzare il seguente codice.

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

Questa risposta è ispirata dalla risposta di Pavel sopra.

Problemi correlati