2010-02-01 15 views
6

El uso de esta función:¿Cómo puedo cambiar la zona horaria de un valor de fecha y hora en Perl?

perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";' 

Se devolverá un epochtime - pero sólo en GMT - si quiero el resultado en GMT + 1 (que es la hora local sistemas (TZ)), ¿Qué necesito para cambiar ?

Gracias de antemano,

Anders

+0

comprobar estos: [http://www.bestofperl.com/how -tos/timezone-conversion-date-time] (http://www.bestofperl.com/how-tos/timezone-conversion-date-time) [http: // w ww.bestofperl.com/how-tos/parsing-datetime-strings](http://www.bestofperl.com/how-tos/parsing-datetime-strings) – Pradeep

Respuesta

4

Sólo hay una definición estándar para epochtime, basado en UTC, y no la gran época para diferentes zonas horarias diferentes.

Si usted quiere encontrar la offset between gmtime and localtime, utilice

use Time::Local; 
@t = localtime(time); 
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t); 
2

Usted sólo tiene que establecer la zona horaria. Proveedores:

 
env TZ=UTC+1 perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";' 
+2

Las zonas horarias TLA son ambiguas y están mal definidas. Es mejor usar nombres [zoneinfo] (http://en.wikipedia.org/wiki/Olson_database): 'TZ = Europe/Berlin perl ...' – daxim

+1

Aquí hay un enlace directamente a la [lista de zona horaria válida cadenas] (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) aka 'Zone.tab'. –

2

Time::Local::timelocal es la inversa de localtime. El resultado será en la hora local de su anfitrión:

$ perl -MTime::Local -le \ 
    'print scalar localtime timelocal "00","00","00","01","01","2000"' 
Tue Feb 1 00:00:00 2000

quiero que la gmtime que corresponde a ese localtime?

$ perl -MTime::Local' -le \ 
    'print scalar gmtime timelocal "00","00","00","01","01","2000"' 
Mon Jan 31 23:00:00 2000

¿Quieres que a la inversa, la localtime que corresponde a ese gmtime?

$ perl -MTime::Local -le \ 
    'print scalar localtime timegm "00","00","00","01","01","2000"' 
Tue Feb 1 01:00:00 2000
+0

Vota, buena información. Gracias. – Anders

2

Mientras Time :: Local es una solución razonable, puede ser mejor usar el módulo orientado a objetos DateTime más moderno. Aquí hay un ejemplo:

use strict; 
use DateTime; 
my $dt = DateTime->now; 
print $dt->epoch, "\n"; 

Para las zonas horarias, puede utilizar el módulo DateTime :: TimeZone.

use strict; 
use DateTime; 
use DateTime::TimeZone; 

my $dt = DateTime->now; 
my $tz = DateTime::TimeZone->new(name => "local"); 

$dt->add(seconds => $tz->offset_for_datetime($dt)); 

print $dt->epoch, "\n"; 

CPAN Enlaces:

DateTime

3
use DateTime; 
my $dt = DateTime->now; 
$dt->set_time_zone('Europe/Madrid'); 
0

Otro ejemplo basado en DateTime::Format::Strptime

use strict; 
use warnings; 
use v5.10; 
use DateTime::Format::Strptime; 

my $s = "2016-12-22T06:16:29.798Z"; 
my $p = DateTime::Format::Strptime->new(
    pattern => "%Y-%m-%dT%T.%NZ", 
    time_zone => "UTC" 
); 

my $dt = $p->parse_datetime($s);  
$dt->set_time_zone("Europe/Berlin"); 
say join ' ', $dt->ymd, $dt->hms; # shows 2016-12-22 07:16:29 
Cuestiones relacionadas