Wie kann ich die Zeitzone eines Datetime-Wert in Perl ändern?
Frage
Mit dieser Funktion:
perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'
Es wird eine epochtime zurückkehren - aber nur in GMT - wenn ich das Ergebnis in GMT + 1 wollen (was die Systeme lokale Zeit (TZ)), was muss ich ändern
Vielen Dank im Voraus,
Anders
Lösung
Es gibt nur eine Standarddefinition für epochtime, basierend auf UTC und nicht anders Epoch Times für verschiedene Zeitzonen.
Wenn Sie die Versatz zwischen gmtime und localtime , Verwendung
use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);
Andere Tipps
use DateTime;
my $dt = DateTime->now;
$dt->set_time_zone( 'Europe/Madrid' );
Während Time :: Local eine vernünftige Lösung ist, können Sie besser dran, den modernere Datetime objektorientierten Modul. Hier ein Beispiel:
use strict;
use DateTime;
my $dt = DateTime->now;
print $dt->epoch, "\n";
Für die Zeitzonen, können Sie die Datetime verwenden :: Time-Zone-Modul.
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 Links:
Sie müssen nur die Zeitzone einzustellen. Versuchen Sie:
env TZ=UTC+1 perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'
Time::Local::timelocal
ist die Umkehrung von localtime
. Das Ergebnis wird in Ihrem Host-Ortszeit:
$ perl -MTime::Local -le \ 'print scalar localtime timelocal "00","00","00","01","01","2000"' Tue Feb 1 00:00:00 2000
Haben Sie die gmtime
möchten, dass entspricht dem localtime
?
$ perl -MTime::Local' -le \ 'print scalar gmtime timelocal "00","00","00","01","01","2000"' Mon Jan 31 23:00:00 2000
Haben Sie es in die andere Richtung wollen um die localtime
dass entspricht der gmtime
?
$ perl -MTime::Local -le \ 'print scalar localtime timegm "00","00","00","01","01","2000"' Tue Feb 1 01:00:00 2000
Ein weiteres Beispiel basierend auf 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