Как я могу преобразовать временные интервалы в 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);