生日php计算器有奇怪的效果

时间:2013-10-19 23:57:58

标签: php

我正在使用此代码计算用户的生日:

            <?php
            $birthDate = $bday."/".$bmonth."/".$byear;
            $birthDate = explode("/", $birthDate);
            $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], 
            $birthDate[2]))) > date("md") ? ((date("Y")-$birthDate[2])-1):(date("Y")-$birthDate[2]));
            echo $age;
            ?>

如果输入是任何一年中任何一个月的第23或第24天(例如,1987年2月23日),则年龄为 - 1年。它会说25岁而不是26岁。我每个月都会测试80年代后期;它始终是23日和24日。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

<?php
$birth = new DateTime("$byear-$bmonth-$bday"); 
$today = new DateTime('today'); 
echo $birth->diff($today)->format('%y');
?>

答案 1 :(得分:1)

计算某个人的年龄时,您只需要知道两件事:他们出生的那一年,以及他们今年是否过生日。

由于您将出生日期视为日,月和年的单独变量,并计算年龄“今天”,您可以执行以下操作(注意:idate()就像{{1} ,但是对于日期的单个方面返回一个整数,因此对于像这样的计算更有效):

date()

我认为这大致就是你要采用的方法,但真正的function calculate_age($byear, $bmonth, $bday) { if ( idate('m') < $bmonth || ( idate('m') == $bmonth && idate('d') < $bday ) ) { // No birthday yet this year, so reduce age by 1 return idate('Y') - $byear - 1; } else { return idate('Y') - $byear; } } 而不是嵌套的if表达式使得更容易看到发生了什么,而且你不需要弄乱多次调用?:mktime