Como posso alterar o fuso horário de um valor de tempo de dados no Perl?
Pergunta
Usando esta função:
perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'
Ele retornará um Epochtime - mas apenas no GMT - se eu quiser o resultado no GMT+1 (qual é o Systems LocalTime (TZ)), o que preciso mudar?
Desde já, obrigado,
Anders
Solução
Existe apenas uma definição padrão para o Epochtime, com base no UTC, e não no tempo diferente para diferentes fusos horários.
Se você quiser encontrar o deslocamento entre GMTime e LocalTime, usar
use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);
Outras dicas
use DateTime;
my $dt = DateTime->now;
$dt->set_time_zone( 'Europe/Madrid' );
Enquanto o tempo :: Local é uma solução razoável, você pode estar melhor usando o módulo mais moderno de Objeto DateTime. Aqui está um exemplo:
use strict;
use DateTime;
my $dt = DateTime->now;
print $dt->epoch, "\n";
Para os fusos horários, você pode usar o módulo DateTime :: Fuzone Time.
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";
Links de CPAN:
Você só precisa definir o fuso horário. Tentar:
env TZ=UTC+1 perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'
Time::Local::timelocal
é o inverso de localtime
. O resultado estará na hora local do seu host:
$ perl -MTime::Local -le \ 'print scalar localtime timelocal "00","00","00","01","01","2000"' Tue Feb 1 00:00:00 2000
Você quer o gmtime
que corresponde a isso localtime
?
$ perl -MTime::Local' -le \ 'print scalar gmtime timelocal "00","00","00","01","01","2000"' Mon Jan 31 23:00:00 2000
Você quer o contrário, o localtime
que corresponde a isso gmtime
?
$ perl -MTime::Local -le \ 'print scalar localtime timegm "00","00","00","01","01","2000"' Tue Feb 1 01:00:00 2000
Um outro exemplo baseado em 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