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

Foi útil?

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:

Data hora

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top