Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我试图精确地确定两个(可能非常遥远的)日期之间的十进制年数,这有什么错?_Php_Date_Datetime_Datediff_Date Difference - Fatal编程技术网

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这两个日期之间一年平均长度的百分比。只有当单位是固定数量时,单位的分数才有意义。这适用于小时、分钟和秒。年和月不是固定的。它的一小部分没有意义。