#!/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文档,但我仍然不明白。
答案 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');