之前我问过这个question并接受了答案,但现在我发现我们服务器上的php版本是5.2而且 DateTime :: diff()不能正常工作。
我想用出生日期和给定日期来计算人的月龄,加上几天。
日期格式输入: Y-m-d(例如:1986-08-23)
输出:
5 months and 20 days old.
150 months and 4 days old.
285 months and 30 days old.
由于
答案 0 :(得分:5)
这是一个能够准确确定月数和天数(包括闰年)的解决方案。假设7月21日到8月21日之类的东西是1个月0天,而不是1个月1天,3月21日到4月20日是0个月30天,而不是1个月0天。在这两种情况下,后者都是当你直接划分30来计算月数时发生的事情。
我确信有一种更好的方法来优化功能,但它可以完成工作:
function diff_date($start_date, $end_date) {
list($start_year, $start_month, $start_day) = explode('-', $start_date);
list($end_year, $end_month, $end_day) = explode('-', $end_date);
$month_diff = $end_month - $start_month;
$day_diff = $end_day - $start_day;
$months = $month_diff + ($end_year - $start_year) * 12;
$days = 0;
if ($day_diff > 0) {
$days = $day_diff;
}
else if ($day_diff < 0) {
$days = $end_day;
$months--;
if ($month_diff > 0) {
$days += 30 - $start_day;
if (in_array($start_month, array(1, 3, 5, 7, 8, 10, 12))) {
$days++;
}
else if ($start_month == 2) {
if (($start_year % 4 == 0 && $start_year % 100 != 0) || $start_year % 400 == 0) {
$days--;
}
else {
$days -= 2;
}
}
if (in_array($end_month - 1, array(1, 3, 5, 7, 8, 10, 12))) {
$days++;
}
else if ($end_month - 1 == 2) {
if (($end_year % 4 == 0 && $end_year % 100 != 0) || $end_year % 400 == 0) {
$days--;
}
else {
$days -= 2;
}
}
}
}
return array($months, $days);
}
list($months, $days) = diff_date('1984-05-26', '2010-04-29');
print $months . ' months and ' . $days . ' days old.';
输出:
314个月和3天。
编辑:我试图摆脱代码中的冗余,忘了重命名变量。此功能现在可以正常用于diff_date('2010-06-29', '2011-07-01')
。
修改:现在可以在31或28/29天的月份之后正常使用。
答案 1 :(得分:0)
使用您最喜欢的日期解析函数(strtotime,strptime,mktime)来获取日期之外的UNIX时间戳,然后是间隔($ now - $ then)...然后work out how many seconds there are in a month并使用它来计算这个人住了多少个月(分裂和其余的是你的朋友)。
这将为您提供一个数学上精确的值,它应该足够接近现实生活。