0

我的客户希望我使用存储在 mysql 中的孩子的出生日期来显示孩子的年龄。我以前的代码不适用于所有格式,因为该站点不限制用户输入此日期的方式。到目前为止,这是我所拥有的,但我无法弄清楚如何检查格式。他们在mm/dd/yyyy, mm/dd/yy, dd/mm/yyyy, dd/mm/yy, Abbrev day, yy,过生日Abbrev day, yyyy。他们还使用不同的分隔符,例如.-很容易检查和使用爆炸。

$birthday=//data from db
$DOB=$birthday;

if(strpos($DOB,'/')){
  list($month,$day,$year)=explode('/',$DOB);
  if(strlen($year)=='4'){
    //year is in Y format
    $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("Y")-$year)-1):(date("Y")-$year));
  }else{
    if(strlen($month)=='4'){
      //format is adjusted using ymd - $month is actually the year, the $day is month, the $year is the day
      $age = (date("md", date("U", mktime(0, 0, 0, $day, $year, $month))) > date("md") ? ((date("Y")-$month)-1):(date("Y") -$month));
    }else{
      //year is in y format
      $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("y")-$year)-1):(date("y")-$year));
    }
  }
}elseif(strpos($DOB,'-')){
  list($month,$day,$year)=explode('-',$DOB);
  if(strlen($year)=='4'){
    //year is in Y format
    $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("Y")-$year)-1):(date("Y")-$year));
  }else{
    if(strlen($month)=='4'){
      //format is adjusted using ymd - $month is actually the year, the $day is month, the $year is the day
      $age = (date("md", date("U", mktime(0, 0, 0, $day, $year, $month))) > date("md") ? ((date("Y")-$month)-1):(date("Y") -$month));
    }else{
      //year is in y format
      $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("y")-$year)-1):(date("y")- $year));
    }
  }
}elseif(strpos($DOB,'.')){
  list($month,$day,$year)=explode('.',$DOB);
  if(strlen($year)=='4'){
    //year is in Y format
    $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("Y")-$year)-1):(date("Y")-$year));
  }else{
    if(strlen($month)=='4'){
      //format is adjusted using ymd - $month is actually the year, the $day is month, the $year is the day
      $age = (date("md", date("U", mktime(0, 0, 0, $day, $year, $month))) > date("md") ? ((date("Y")-$month)-1):(date("Y") -$month));
    }else{
      //year is in y format
      $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("y")-$year)-1):(date("y")- $year));
    }
  }
}else{}

echo $age;

}
4

1 回答 1

0

您希望做的最好的事情是strtotime()。所以这里是计算年龄的代码:

$birthday = // value from db
$birthdayTime = strtotime($birthday);

$age = date('Y') - date('Y', $birthdayTime);

if (date('md') < date('md', $birthdayTime)) {
    // we haven't reached their birthday this year so subtract one
    $age--;
}

echo $age;

我们在代码中所做的事情。首先,我们将字符串生日转换为 unix 时间戳。起初,人们可能想从当前时间戳中减去该时间戳,然后除以一年中的秒数,但因为这不考虑闰年,并且会在 2 月底/3 月初的生日导致奇怪的结果我们所做的是从当前年份中减去出生年份,然后检查我们是否已经过这一年的生日。如果我们没有,那么我们减去 1 并得到年龄。

如果您的数据库允许 dd/mm/yy 和 mm/dd/yy,则 100% 不可能判断 01/02/03 是 1 月 2 日还是 2 月 1 日。因此,在您修复数据之前,您会遇到一些小问题。

您还可以尝试做出有根据的猜测 mm/dd/yy 更像是美国日期格式,而 dd/mm/yy 更像是美国以外的任何地方的日期格式,因此您可以尝试以这种方式更新数据库数据.

于 2013-06-10T15:31:27.737 回答