考虑以下代码片段,该代码片段接受用户输入(日期)并使用来自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
答案 0 :(得分:4)
尝试Date_ConvTZ()
功能:
my $date = UnixDate( Date_ConvTZ( $input, 'CET', 'PST' ), "%Y-%m-%d %T");
的手册
答案 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::Manip
和DateTime
可能没什么坏处。