笔者在上篇文章写了关于计算年龄的文章,那是给出了生日,根据当天来计算。请参考文章php计算年龄算法,包含年月天数 。那么问题来了,在网页身高体重页面需要根据给出的日期来计算这段时间的年月天数,笔者花了一个多钟才解决。
网页左侧日期是html5的日期输入类型date,而且安卓和apple对于这个控件的解释是不一样的,格式不一样,中间连接符号有-和/之分。参照方法根据连接符号来解析出年月日比较麻烦。上一篇文章是php中利用date函数分别读取年月日,date("Y")、date("m")、date("d")是很简单的。那么一句有的日期比如2020-09-08或者2020/09/08怎么处理呢?

这个和上一篇文章的代码有些区别,将$date_value的年月日提取出来,用了一个很重要的函数strtotime,trtotime() 函数将任何英文文本的日期或时间描述解析为 Unix 时间戳,简直不要太方便啦。然后利用date函数从Unix 时间戳提取出年月日的数据。
<?php
class CalAge {
public function getAge($date_value) {
$str_time=strtotime($date_value);
$year = date("Y",$str_time);
$month = date("m",$str_time);
$day = date("d",$str_time);
$byear=2020;
$bmonth = 6;
$bday = 4;
if ($bmonth < 10) {
$bmonth = '0' . $bmonth;
}
if ($bday < 10) {
$bday = '0' . $bday;
}
$bi = intval($byear . $bmonth . $bday);
$ni = intval($year . $month . $day);
$not_birth = 0;
if ($bi > $ni) {
$not_birth =1;
$tmp = array($byear, $bmonth, $bday);
list($byear, $bmonth, $bday) = array($year, $month, $day);
list($year, $month, $day) = $tmp;
list($bi, $ni) = array($ni, $bi);
}
$years = 0;
while (($bi + 10000) <= $ni) {//先取岁数
$bi += 10000;
$years++;
$byear++;
}//得到岁数后 抛弃年
list($m, $d) = $this->_getMD(array($year, $month, $day), array($byear, $bmonth, $bday));
if($not_birth==1)
$shengri="(生日)";
else
$shengri="";
return $years."岁".$m."月".$d."天"." ".$shengri;
}
/**
* 只能用于一年内计算
* @param type $ymd
* @param type $bymd
*/
private function _getMD($ymd, $bymd) {
list($y, $m, $d) = $ymd;
list($by, $bm, $bd) = $bymd;
if (($m . $d) < ($bm . $bd)) {
$m +=12;
}
$month = 0;
while ((($bm . $bd) + 100) <= ($m . $d)) {
$bm++;
$month++;
}
if ($bd <= $d) {//同处一个月
$day = $d - $bd;
} else {//少一个月
$mdays = $bm > 12 ? $this->_getMothDay(++$by, $bm - 12) : $this->_getMothDay($by, $bm);
$day = $mdays - $bd + $d;
}
return array($month, $day);
}
private function _getMothDay($year, $month) {
switch ($month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
$day = 31;
break;
case 2:
$day = (intval($year % 4) ? 28 : 29); //能被4除尽的为29天其他28天
break;
default:
$day = 30;
break;
}
return $day;
}
}
?>
接下里就调用这个函数就行了。$date_value可以替换成$date_value = "2020-7-25";照样行得通。其实php还是很强大的,在linux编程时其内置函数可以帮助解决很多问题,使用笔者shell脚本和php脚本都在做,双管齐下。因为shell脚本的命令附带参数有些复杂,代码辨识度没有php那么好,而且php多平台特性在windows移植就更加方便了。
<?php
$date_value = "2020/7/25";
require "cal_age_weight.php";
$ca = new CalAge();
$age=$ca->getAge($date_value);
echo $age;
?>
网友评论