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

War es hilfreich?

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:

Datetime

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top