2010-08-02 51 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