2009-06-13 14 views
7

Había asumido que sería tan simple como $ENV{TZ}, pero la variable de entorno TZ no está configurada, y aun así el comando date todavía sabe que estoy en EDT, por lo que debe haber alguna otra forma de determinar la zona horaria (aparte de decir chomp(my $tz = qx/date +%Z/);) .¿Cómo determino la zona horaria actual con la que está configurada una máquina con Perl?

+0

Solo para información adicional, en mi sistema, la zona horaria está regulada por el archivo/etc/localtime y libc parece saber cómo usar eso. –

Respuesta

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

Pensé en% Z, pero recuerdo algo que no funciona en algunos sistemas. –

+0

Según el tiempo de trabajo del hombre,% Z es una especificación estándar y debe ser compatible con todas las plataformas. –

+1

Creo que estaba recordando esto de los documentos POSIX: el especificador "Z" es notoriamente imposible de importar ya que los nombres de las zonas horarias no son estándar. Cumplir con los especificadores numéricos es la ruta más segura. Pero creo que esto es probablemente lo suficientemente seguro para mis propósitos. –

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

tzname() le da acceso a la POSIX mundial tzname - pero tiene que haber llamado localtime() para que sea configurada en el primer lugar.

6

Si quieres algo más portátil que POSIX (pero probablemente mucho más lento) que puede utilizar DateTime :: Zona horaria para esto:

use DateTime::TimeZone; 

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

Tal vez esto más rápido:

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

Para complementar su respuesta, puede usar el botón [edit] (http://stackoverflow.com/posts/29400576/edit). – ZygD

0

Si sólo necesita algo así como +05:30 (UTC + 5.5/India time), puede usar el siguiente código.

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

Responde esta respuesta a la respuesta de Pavel anterior.

Cuestiones relacionadas