为什么这个perl DateTime数学会产生意想不到的结果?

时间:2015-10-31 22:24:09

标签: perl datetime time

#!/usr/bin/perl
use DateTime;

$a = DateTime->new(year=>1952,month=>10,day=>21);
$b = DateTime->new(year=>2015,month=>10,day=>31);

$dif = $b-$a;

print $dif->years() ." ". $dif->months() ." ". $dif->days();
# result: 63 0 3

从哪里获得3天?我的期望是63 0 10。

#!/usr/bin/perl
use DateTime;

$a = DateTime->new(year=>1952,month=>11,day=>1);
$b = DateTime->new(year=>2015,month=>10,day=>31);

$dif = $b-$a;

print $dif->years() ." ". $dif->months() ." ". $dif->days();
# result 62 11 2

我对这个的预期是62 11 31左右。

我正在努力做一些基本的出生日期到年龄数学。月份和年份似乎按照我的预期工作,但这一天似乎无法预测。我已经阅读了CPAN文档,但我仍然不明白。

1 个答案:

答案 0 :(得分:11)

$dif->years$diff->months,特别是$diff->days不符合您的期望。来自DateTime::Duration documentation ...

  

这些方法返回数字,表示给定单位的数量       对象表示在完成任何较大单位的转换后。对于       例如, 天首先转换为周,然后剩余的是       返回 即可。这些数字总是正面的。

     

以下是每种方法返回的内容:

$dur->years()       == abs( $dur->in_units('years') )
$dur->months()      == abs( ( $dur->in_units( 'months', 'years' ) )[0] )
$dur->weeks()       == abs( $dur->in_units( 'weeks' ) )
$dur->days()        == abs( ( $dur->in_units( 'days', 'weeks' ) )[0] )

如果您发现这一点令人困惑,我也一样。

你想要的是in_units

# 63 0 10
say join " ", $dif->in_units('years', 'months', 'days');