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

Fle*_*ore 7 perl time datetime

#!/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
Run Code Online (Sandbox Code Playgroud)

从哪里获得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
Run Code Online (Sandbox Code Playgroud)

我对这个的期望是62 11 31左右.

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

Sch*_*ern 11

$dif->years,$diff->months尤其$diff->days不要做你期望的事.从DateTime :: Duration文档 ...

这些方法返回数字,表示在完成对任何较大单位的转换后,对象所代表的单位数量.例如,首先将天数转换为星期,然后返回余数.这些数字总是积极的.

这是每个方法返回的内容:

$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] )
Run Code Online (Sandbox Code Playgroud)

如果你发现这令人困惑,那我也是.

你想要的是什么in_units.

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