我怎样才能在Perl中转换时区?

时间:2010-02-24 21:07:00

标签: perl datetime gmt

我想在Perl中将日期/时间GMT 0转换为GMT -6。

例如,DHCP服务器租约时间采用以下格式:

  

2010/02/18 23:48:37

我正在尝试将该时间转换为Localtime区域(GMT -6),但需要它来兑现夏令时。

下面的脚本可能有点矫枉过正,但我​​不知道如何从这里开始。 (任何建议都很棒)。

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的当地时区,但我不确定如何解决这个问题。

3 个答案:

答案 0 :(得分:18)

调用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_zoneUTC更改为America/Chicago

答案 1 :(得分:0)

Time::Piece是一个非常轻量级的优质代码。或者您可以使用内置插件strftimePOSIX::strptime

答案 2 :(得分:-2)

#!/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);