DateTime Diff在月份中存在不一致

时间:2014-03-11 10:20:30

标签: php datetime

月份差异有问题,以下函数会返回月份年龄

function ageMonths($dob)
{
    //new date time $dob must be Y-m-d format
    $dobObject = DateTime::createFromFormat('Y-m-d',$dob);

    //current date
    $nowObject = new DateTime();

    //difference
    $diff = $nowObject->diff($dobObject);
    return $diff->y.'.'.$diff->m;
}

问题是我在几个月内有一些不一致的确切一些不是,请看下面的示例

5.5 - 2008-10-03 correct
8.2 - 2005-12-27 must be 8.3
4.5 - 2009-09-24 must be 4.6
6.7 - 2007-07-14 must be 6.8
6.7 - 2007-07-17 must be 6.8
6.5 - 2007-09-28 must be 6.6
7.1 - 2007-01-17 must be 7.2
7.1 - 2007-02-10 correct
6.3 - 2007-11-16 must be 6.4
7.1 - 2007-02-10 correct
6.3 - 2007-11-16 must be 6.4
6.10 - 2007-05-08 correct

我找不到有什么问题,有什么想法吗?

2 个答案:

答案 0 :(得分:0)

没有四舍五入,只是你的“月差异”概念与DateInterval使用的概念不同。

减去两个DateTime值会使结果DateInterval的“月”值等于整个的数量(在日历意义上)日期之间的差异月数。例如,在日历方面,2013-03-11距离2013-04-01零距离(2013-04-11将在一个月之后)。

你想要的不是日历差异的月份,而是月份指数的算术差异。例如,2013-03-11与2013-04-01的月份差异为1(因为4 - 3 = 1)。

所以,用这种方式得到你想要的结果:

$dobObject = DateTime::createFromFormat('Y-m-d',$dob);
$nowObject = new DateTime();

return $dobObject->format('n') - $nowObject->format('n'); // might be negative

<强> See the difference live

答案 1 :(得分:-1)

2008-10-03 - &gt; Y - m - d这里m代表前导零01到12。 2008-10-03 - &gt; Y - n - d这里n表示没有前导零1到12。

使用n获取计算年龄的确切月份。欢呼声