Как я могу преобразовать временные интервалы в Perl?

Я пытаюсь преобразовать дату/время GMT 0 в GMT -6 на Perl.

Например, время аренды сервера DHCP находится в следующем формате:

2010/02/18 23:48:37

Я пытаюсь преобразовать это время в зону локального времени (GMT -6), но нужно, чтобы он соблюдал летнее время.

script ниже может быть излишним, но я не уверен, как это исходить отсюда. (Любые предложения были бы ужасными).

my $TIMESTART;

$TIMESTART = "2010/02/18 23:48:37";
$TIMESTART =~ s/\//-/g;

use DateTime;
use DateTime::TimeZone;

use DateTime::Format::MySQL;
my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART);

my $tz = DateTime::TimeZone->new( name => 'America/Chicago' );

print $tz->offset_for_datetime($dt) . "\n";

Он выведет следующие строки:

2010-02-18T23: 48: 37
-21600

Мне нужно добавить -21600 к дате, чтобы получить локальный часовой пояс GMT -6, но я не уверен, как это сделать.

Ответ 1

Вызовите set_time_zone метод 2 раза:

my $dt = DateTime::Format::MySQL->parse_datetime($TIMESTART);
$dt->set_time_zone('UTC'); ## set timezone of parsed date time
$dt->set_time_zone('America/Chicago'); ## change timezone in safe way

print DateTime::Format::MySQL->format_datetime($dt),"\n"; ## check the result

Как это работает:

  • когда вы создаете объект DateTime без указания часового пояса, устанавливается "плавающий" часовой пояс
  • первый вызов set_time_zone изменить часовой пояс на UTC без преобразования
  • второй вызов set_time_zone изменить UTC на America/Chicago

Ответ 2

Это преобразует время UTC в время ETC. Вы также можете использовать дату/время в любом формате с использованием параметра + FORMAT даты.

date --date = 'TZ = "ETC" 18:30'

Ответ 3

Time::Piece - очень легкий кусок кода хорошего качества. Или вы можете просто использовать встроенные модули и strftime и POSIX::strptime

Ответ 4

#!/usr/bin/perl -w
($sec,$min,$hour,$mday,$mon,$year) = gmtime(time+21600);
$year = $year + 1900;
printf("%02d:%02d:%02d %02d.%02d.%04d\n", $hour,$min,$sec,$mday,$mon,$year);