关于this thread,我已经制定了部分解决方案:
function strtosecs($time,$now=null){
static $LEAPDIFF=86400;
$time=strtotime($time,$now);
return $time-(round((date('Y',$time)-1968)/4)*$LEAPDIFF);
}
该函数应该在没有检查闰年的情况下获得给定字符串的秒数。
它计算1970年的闰年数[(1986年)/ 4],乘以闰年和正常年份之间的秒数差异(最后,它只是数字一天中的几秒钟。
最后,我只是从计算出的时间中删除所有那些多余的闰年秒。以下是输入/输出的一些示例:
// test code
echo strtosecs('+20 years',0).'=>'.(strtosecs('+20 years',0)/31536000);
echo strtosecs('+1 years',0).'=>'.(strtosecs('+1 years',0)/31536000);
// test output
630676800 => 19.998630136986
31471200 => 0.99794520547945
您可能会问我为什么要对输出进行划分?这是测试它; 31536000是一年中的秒数,所以19.99 ...应该是20和0.99 ......应该是1。 当然,我可以解决所有问题并获得“正确”答案,但我担心这些不准确之处。
编辑1:因为它看起来不太明显,我的问题是关于inveteracies;你只是不问PHP 20年,它给你19.99 ......,对吧?
Edit2:这一切似乎都归结为1968年的部分;
...ex: (2008-1969)/4 = 9.75...
)以及mentioned here。在第2年(+ 3年)之后准确。答案 0 :(得分:1)
这可能与使用PHP管理浮点数时遇到的固有不准确性有关吗?
答案 1 :(得分:1)
您应该在计算中替换 < / p>
1968
(它来自哪里?)由unix时间的原点1970
替换,您将得到更准确的结果。
修改强>
您必须执行intval
来计算必须为整数的leapyears数量:
return $time - (intval( (date('Y', $time) - 1969) / 4) * $LEAPDIFF);
这将在+0 -> +68
范围内为您提供正确的结果,在32位机器上的unix时间结束