2010-08-02 50 views
4
use DateTime ; 

my $date = "2010-08-02 09:10:08"; 

my $dt = DateTime->now(time_zone => 'local')->set_time_zone('floating'); 
print $dt->subtract_datetime($date); 

它不工作;问题是什么?如何计算Perl中的DateTime差异?

的错误信息是:

Can't call method "time_zone" without a package or object reference at 
/opt/perl/perl5.12/lib/site_perl/5.12.0/x86_64-linux/DateTime.pm line 1338 
+0

定义您的$ data var为日期时间: my $ date = DateTime-> new(year => 2010,month => 8,day => 2,hour => 9,minute => 10,second => 8); – benzebuth 2010-08-02 15:24:15

回答

18

你需要转换日期字符串到datetime对象首先,使用 自定义格式或许多日期时间::格式之一:: *可用的库。 您使用的数据库中常用的格式,所以我选择了MySQL 格式化(然后在 DateTime::Format::Duration定义的最终结果自定义时间格式, 从例子中复制):

use DateTime; 
use DateTime::Format::MySQL; 
use DateTime::Format::Duration; 

my $date = "2010-08-02 09:10:08"; 

my $dt1 = DateTime->now(time_zone => 'floating', formatter => 'DateTime::Format::MySQL'); 
my $dt2 = DateTime::Format::MySQL->parse_datetime($date); 

my $duration = $dt1 - $dt2; 
my $format = DateTime::Format::Duration->new(
    pattern => '%Y years, %m months, %e days, %H hours, %M minutes, %S seconds' 
); 
print $format->format_duration($duration); 

# prints: 
# 0 years, 00 months, 0 days, 00 hours, 421 minutes, 03 seconds 
3

很好,乍一看,我想这将$dt->subtract_datetime(...)工作,如果你 减去两个datetime对象。
即:你的$date应该是一个日期时间

6

$date必须是一个DateTime对象,而不是一个简单的字符串。见 DateTime。而且,您不能简单地打印返回值 subtract_datetime,因为它返回一个引用。您必须使用 方法(如hours)来提取有用的信息。

use strict; 
use warnings; 
use DateTime; 

my $dt2 = DateTime->new(
         year => 2010, 
         month => 8, 
         day => 2, 
         hour => 9, 
         minute => 10, 
         second => 8, 
         time_zone => 'local', 
        ); 

my $dt1 = DateTime->now(time_zone => 'local')->set_time_zone('floating'); 

my $dur = $dt1->subtract_datetime($dt2); 
print 'hours = ', $dur->hours(), "\n"; 

__END__ 

hours = 2