没有闰年的PHP strtotime

时间:2010-12-24 07:48:31

标签: php strtotime leap-year seconds

关于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年的部分;

  • 1970;在我尝试过的所有测试中都发现它很准确。
  • 1969;找到它used here...ex: (2008-1969)/4 = 9.75...)以及mentioned here。在第2年(+ 3年)之后准确。
  • 1968;如下所述,这是从unix时间(1970年)开始的闰年的“零年”。这听起来是“正确的”(对我来说),但它并不准确, at

2 个答案:

答案 0 :(得分:1)

这可能与使用PHP管理浮点数时遇到的固有不准确性有关吗?

http://php.net/manual/en/language.types.float.php

答案 1 :(得分:1)

您应该在计算中替换1968(它来自哪里?)由unix时间的原点1970替换,您将得到更准确的结果。 < / p>

修改

您必须执行intval来计算必须为整数的leapyears数量:

return $time - (intval( (date('Y', $time) - 1969) / 4) * $LEAPDIFF);

这将在+0 -> +68范围内为您提供正确的结果,在32位机器上的unix时间结束