2011-03-03 18 views
1

考虑下面的代码片段,它需要用户输入(日期),并使用UnixDate从日期:: MANIPPerl的日期:: MANIP - 如何在给定的日期转换为另一时区

#!/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与另一个时区一起使用,例如,太平洋标准(时区:PST)。在这种情况下,输出应为:

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

回答

4

尝试Date_ConvTZ()功能:

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

从手动从Date::Manip::DM6

+1

是的!真棒。正是我在找什么。那就是在Date :: Manip页面上。 – emx

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可能没有什么坏处。

相关问题