Php 我试图精确地确定两个(可能非常遥远的)日期之间的十进制年数,这有什么错?
当前代码/示例(请仔细阅读日期/时间):Php 我试图精确地确定两个(可能非常遥远的)日期之间的十进制年数,这有什么错?,php,date,datetime,datediff,date-difference,Php,Date,Datetime,Datediff,Date Difference,当前代码/示例(请仔细阅读日期/时间): $a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:00')); $average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y); var_dump(bcdiv($a->days, $average_number_of_days_for_the_re
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:01'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-03 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-01 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
预期/期望输出:
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:01'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-03 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-01 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
实际输出:
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:01'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-03 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-01 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
分析:
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-02 15:00:01'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-03 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
$a = date_diff(date_create('1980-01-02 15:00:00'), date_create('2020-01-01 15:00:00'));
$average_number_of_days_for_the_relevant_years = bcdiv($a->days, $a->y);
var_dump(bcdiv($a->days, $average_number_of_days_for_the_relevant_years));
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "40.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
string(102) "39.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
无论我尝试了什么(在过去和今天提问之前,我尝试了无数的事情),PHP似乎从未让我计算两个日期之间的准确“十进制年份”。它要么迫使我用“365”除法,这将导致日期跨度越长,数字越不准确;要么像我上面所做的那样,只给我“整数”:有人被认为正好是39岁,直到它切换到40岁为止
我也用(float)
s尝试过这一点。同样的基本问题。我在绝望中使用了bcdiv()
,认为可能是浮点数把它和舍入之类的东西搞砸了
在这一点上,我真的不知道该怎么办。所有在线“解决方案”都大错特错。我看过很多代码,它们都做得不正确。遗憾的是,date\u diff
对象只提供了“零散”的数据和总天数,但对于年数没有很好的十进制/浮点数。我不知道他们为什么会排除最有用的数据,但他们确实排除了,而我就在这里,在这个问题上浪费了我的生命。。。这很讽刺,因为这是关于计算年龄的
我再也睡不着了,除非这件事最终得到妥善准确的解决,不管日期相隔多远。这种事情让我发疯,对我来说,有一种需求是典型的,而现有的机制无法满足这种需求,尽管在我看来,这是迄今为止最常见的期望输出
能不能请一个真正聪明的人帮我一劳永逸地解决这个问题?(我对另一个不准确的解决方案不感兴趣,例如,如果你比较相隔千年的日期倍,它就会分崩离析。)不可能确定两个日期之间年份的精确小数差 可以给出几年的分数作为说明。例如,3年零6个月可以写成3.5年 humanYearDiff()函数提供了这样一个值以供说明。结果不准确,因此不适合进一步计算。为了简化问题,该月也按31天计算
function humanYearDiff(DateTime $start,Datetime $end){
$diff = $start->diff($end);
$days = $diff->d + $diff->h/24 + $diff->i/1440 + $diff->s/86400;
$years = $diff->y + $diff->m/12.0 + $days/372;
return $diff->invert ? -$years : $years;
}
一个小测试:
$testData = [
['1980-02-01 15:00','2020-02-01 15:00'],
['1980-02-01 15:00','2020-08-01 15:00'],
['1980-02-01 15:00','2020-05-01 15:00'],
['1980-02-01 15:00','2020-02-01 15:01'],
['1980-02-01 15:00','2020-02-01 14:59'],
['today','today +6 month'],
];
foreach($testData as $dateStartEnd){
$floatYear = humanYearDiff(date_create($dateStartEnd[0]),date_create($dateStartEnd[1]));
echo $dateStartEnd[0].' -> '.$dateStartEnd[1].' = '.$floatYear." Years<br>\n";
}
什么是“十进制年”有确切的定义吗?特别是闰年应该如何考虑?我想,闰年的开始日期或结束日期是在2月28日之前还是之后,都必须加以考虑?@CBroe这两个日期之间一年平均长度的百分比。只有当单位是固定数量时,单位的分数才有意义。这适用于小时、分钟和秒。年和月不是固定的。它的一小部分没有意义。