年龄精确から天までの計算に使用されます
- /*
- * このライセンス ヘッダーを変更するには、プロジェクト プロパティで [ライセンス ヘッダー] を選択します。
- * このテンプレート ファイルを変更するには、[ツール] | [ライセンス ヘッダー] を選択します。テンプレート
- * エディタでテンプレートを開きます。
- */
- class Age {
-
- /**
- * 年齢を年、月、日まで正確に計算します
- * @param type $birthday
- * @return array
- */
- public function calAge($birthday) {
- list($byear, $bmonth, $bday ) =explode('-', $birthday);
- list($year, $month, $day) =explode('-', date('Y-m-d'));
- $bmonth = intval($bmonth) ;
- $bday = intval($bday);
- 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));
- return array('year' => $years, 'month' => $ m, 'day' => $d, 'not_birth' => $not_birth);
- }
-
- /**
- * 1年以内の計算にのみ使用できます
- * @param type $ymd
- * @param type $bymd
- */
- public function getMD($ymd, $bymd) {
- list($y) , $m, $d) = $ymd;
- list($by, $bm, $bd) = $bymd;
- if (($m . $d) $ 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;
- }
- 配列を返します($month, $day);
- }
-
- プライベート関数 _getMothDay($year, $month) {
- switch ($month) {
- ケース 1:
- ケース 3:
- ケース 5:
- ケース 7:
- ケース 8:
- ケース 10:
- ケース 12:
- $day = 31;
- ブレーク;
- ケース 2:
- $day = (intval($year % 4) ? 28 : 29); //能被4除尽為29日その他28天
- break;
- default:
- $day = 30;
- Break;
- }
- return $day;
- }
-
- }
-
- $cage = new Age() ;
- $test = array(
- '1990-06-12',
- '1990-07-13',
- '1990-08-16',
- '1990-10-10',
- '1990-10-13 '、
- '1990-10-15'、
- '1990-11-9'、
- '1990-11-22'、
- '2016-11-22'、
- '2016-8-22'、
- '2016 -10-13',
- );
- echo date('Y-m-d');
- echo '
';</li>
<li>foreach($test as $v){</li>
<li> $tmp = $cage->calAge( $v);</li>
<li> echo $v , ':', $tmp['year'], '年', $tmp['month'],</li>
<li> '月', $tmp['day'], '天', ';', $tmp['not_birth'], '<br>';</li>
<li>}</li>
<li>echo ' ' ;
-
-
- /*
- 运行结果:
- 2015-10-13
- 1990-06-12:25年4月1日;0
- 1990-07-13:25年3月0天;0
- 1990-08 -16:25年1月27日;0
- 1990-10-10:25年0月3日;0
- 1990-10-13:25年0月0天;0
- 1990-10-15:24年11月28日;0
- 1990-11-9:24年11月4日;0
- 1990-11-22:24年10月21日;0
- 2016-11-22:1年1月9日; 1
- 2016-8-22:0年10月9天;1
- 2016-10-13:1年0月0天;1
-
- *
- */
-
复制發
|