PHP中年龄计算的差异

时间:2014-01-31 23:28:15

标签: php

下面是我尝试以此格式获得当年3月31日学生年龄的代码 - > 6年,3个月,14天。但是我在Days中有所不同。我查看了此网站http://www.calculator.net/age-calculator.html

的年龄

示例1. 19-12-2007应显示6年3个月12天
我的代码显示在哪里 - 6年,3个月,13天

示例2. 29-06-2009应显示4年9个月2天
我的代码显示在哪里 - 4年,9个月,6天

示例3. 29-02-2008应显示6年1个月2天
我的代码显示在哪里 - 6年,1个月,1天

这是代码 -

<?php
function dt_wrd($date)
{

$date1 = $date;
$date2 = "31-03-".date('Y');

$diff = abs(strtotime($date2) - strtotime($date1));

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

$ys="s";
$ms="s";
$ds="s";

if($months=="1" ||$months=="0" )
{
    $ms="";
}
if($years=="1" ||$years=="0" )
{
    $ys="";
}
if($days=="1" ||$days=="0" )
{
    $ds="";
}

echo "$years Year$ys , $months Month$ms , $days Day$ds";
}

$date1='29-06-2009';//$_GET['dob'];
dt_wrd($date1);

?>

2 个答案:

答案 0 :(得分:1)

http://www.php.net/manual/en/datetime.diff.php

看一下第一个例子。它只用几行代码就可以显示你想要做的事情。

编辑:您可以更改format命令以打印出所需的格式。您可能需要回复3次(多年一次,一次持续数月,持续数天)。

答案 1 :(得分:1)

您假设所有月份都是30天;这不是你如何计算月和日的差异。

更明智的做法是取一天的数字并减去它。如果一个小于另一个,则需要考虑上个月的天数。

这样的事情:

<?php
function lastMonth($a)
{
$d1 = strtotime(implode("-", $a));
$a[1] = $a[1] - 1;
$d2 = strtotime(implode("-", $a));
$days =  ($d1 - $d2) / (60 * 60 * 24);
return $days;
}

function dt_wrd($date1, $date2)
{
date_default_timezone_set('US/Eastern');
$s1 = strtotime($date1);
$s2 = strtotime($date2);
if($s1 > $s2) {
  $temp = $s1;
  $s1 = $s2;
  $s2 = $temp;
}
$fmtDate1 = date("d-m-y", $s1);
$fmtDate2 = date("d-m-y", $s2);
$fmtArr1 = explode( "-", $fmtDate1);
$fmtArr2 = explode( "-", $fmtDate2);

$days = $fmtArr2[0] - $fmtArr1[0];
$months = 0;
if($days < 0) {
  $months = $months - 1;
  $days = $days + lastMonth($fmtArr1);
}
$months = $fmtArr2[1] - $fmtArr1[1] + $months;
$years = $fmtArr2[2] - $fmtArr1[2];
if($months < 0) {
  $months = $months + 12;
  $years = $years - 1;
}

$ys="s";
$ms="s";
$ds="s";

if($months=="1" ||$months=="0" )
{
    $ms="";
}
if($years=="1" ||$years=="0" )
{
    $ys="";
}
if($days=="1" ||$days=="0" )
{
    $ds="";
}

echo "$years Year$ys , $months Month$ms , $days Day$ds\n";
}

$today='31-03-2014';
$date1='19-12-2007';
$date2='29-06-2009';
$date3='29-02-2008';
dt_wrd($date1,$today);
dt_wrd($date2,$today);
dt_wrd($date3,$today);
?>

输出:

6 Years , 3 Months , 12 Days
4 Years , 9 Months , 2 Days
6 Years , 1 Month , 2 Days

正如所料。

我测试了一些边缘情况(比如 - 如果你在1月份会发生什么,并且必须查看12月份的天数。你会要求“0月”。事实证明这样做很好 - 第0个月有12天的预期31天。)