Как я могу изменить часовой пояс значения datetime в Perl? - PullRequest
6 голосов
/ 01 февраля 2010

Использование этой функции:

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

Он вернет время эпохи - но только в GMT - если я хочу получить результат в GMT + 1 (это системное местное время (TZ)), что мне нужно изменить?

Заранее спасибо,

Anders

Ответы [ 6 ]

6 голосов
/ 27 ноября 2012
use DateTime;
my $dt   = DateTime->now;
$dt->set_time_zone( 'Europe/Madrid' );
4 голосов
/ 01 февраля 2010

Существует только одно стандартное определение для времени эпохи, основанное на UTC, и не разные времена для разных часовых поясов.

Если вы хотите найти смещение между gmtime и местным временем , используйте

use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);
2 голосов
/ 01 февраля 2010

Хотя Time :: Local является разумным решением, вам может быть лучше использовать более современный объектно-ориентированный модуль DateTime.Вот пример:

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

Для часовых поясов вы можете использовать модуль 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 Links:

DateTime

2 голосов
/ 01 февраля 2010

Time::Local::timelocal является обратной величиной localtime. Результат будет по местному времени вашего хоста:

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

Вы хотите gmtime, который соответствует этому localtime?

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

Вы хотите это наоборот, localtime, который соответствует этому gmtime?

$ perl -MTime::Local -le \
    'print scalar localtime timegm "00","00","00","01","01","2000"'
Tue Feb  1 01:00:00 2000
2 голосов
/ 01 февраля 2010

Вам просто нужно установить часовой пояс. Попробуйте:

env TZ=UTC+1 perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'
0 голосов
/ 22 декабря 2016

Другой пример, основанный на 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
...