0

关于这个线程,我开发了一个部分解决方案:

function strtosecs($time,$now=null){
    static $LEAPDIFF=86400;
    $time=strtotime($time,$now);
    return $time-(round((date('Y',$time)-1968)/4)*$LEAPDIFF);
}

该函数应该在不检查闰年的情况下获取给定字符串的秒数。

它会计算 1970 年的闰年 [(year-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:因为它看起来并不明显,所以我的问题在于陈旧;你只是不问 PHP 20 年,它给你 19.99...,对吗?

Edit2:这一切似乎都归结为 1968 年的部分;

  • 1970;在我尝试过的所有测试中发现它都是准确的。
  • 1969;发现它在此处使用( ...ex: (2008-1969)/4 = 9.75...) 以及在此处提及。第 2 年(+3 年)后准确。
  • 1968; 如下所述,这是从 Unix 时间(1970 年)开始的闰年的“零年”。这听起来“正确”(对我来说),但它根本不准确
4

2 回答 2

1

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

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

于 2010-12-24T09:28:18.677 回答
1

你应该1968在你的计算中(它来自哪里?)替换为 unix time 的起源:1970你会得到更准确的结果。

编辑

你必须做一个intval计算闰年的数量,它必须是一个整数:

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

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

于 2010-12-24T10:12:05.690 回答