Perl的日期:: Manip - 如何将给定日期转换为另一个时区

时间:2011-03-03 08:28:29

标签: perl date timezone

考虑以下代码片段,该代码片段接受用户输入(日期)并使用来自Date :: Manip的UnixDate对其进行格式化

#!/usr/bin/perl
use Date::Manip;

my $input = join(" ", @ARGV);
my $date = UnixDate($input, "%Y-%m-%d %T"); 
print $date;

这样做是为了让用户输入友好日期,例如“昨天”或“ 1周前”。

我想将 $ date 与不同的时区一起使用(它将用于提取SQL数据)。怎么做? 我没有找到任何允许放置时区的UnixDate构造,我不知道如何重新格式化用户输入(将时区名称连接到它没有帮助)。

示例

用户位于中欧的某个地方(时区:CET)并进入“今天下午1点”。执行上述代码如下:

$ ./test.pl today at 1pm
2011-03-03 13:00:00

这是预期的结果,因为没有时区更改生效。我想要的是将 $ date 与其他时区一起使用,例如:太平洋标准(时区:太平洋标准时间)。在这种情况下,输出应为:

$ ./test.pl today at 1pm
2011-03-03 04:00:00

2 个答案:

答案 0 :(得分:4)

尝试Date_ConvTZ()功能:

 my $date = UnixDate( Date_ConvTZ( $input, 'CET', 'PST' ), "%Y-%m-%d %T");

来自Date::Manip::DM6

的手册

答案 1 :(得分:0)

我不知道如何让Date::Manip了解时区,但DateTime会非常直接:

my $input = join(" ", @ARGV);
my $date  = UnixDate($input, "%Y-%m-%d %T");
$date =~ /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
my $dt = DateTime->new(
    year      => $1,
    month     => $2,
    day       => $3,
    hour      => $4,
    minute    => $5,
    second    => $6,
    time_zone => 'CET',
);
$dt->set_time_zone('America/Vancouver'); # My DateTime::TimeZone doesn't have PST

您也可以将Date::Manip用途替换为DateTime modules中的一个或多个,DateTime是Perl的标准日期操作库,因此将其用于所有日期 - 时间需要有意义; OTOH,使用对你有用的东西,如果完成工作,使用Date::ManipDateTime可能没什么坏处。