【发布时间】:2011-05-30 07:50:31
【问题描述】:
关于this thread,我开发了一个部分解决方案:
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。 当然,我可以四舍五入得到“正确”的答案,但我担心不准确。
Edit1:因为它看起来并不明显,所以我的问题是老掉牙;你只是不问 PHP 20 年,它给你 19.99...,对吗?
Edit2:这一切似乎都归结为大约 1968 年的部分;
- 1970;在我尝试过的所有测试中都发现它是准确的。
- 1969;找到它used here (
...ex: (2008-1969)/4 = 9.75...) 以及mentioned here。第 2 年(+3 年)后准确。 - 1968;如下所述,这是从 Unix 时间(1970 年)开始的闰年的“零年”。这听起来“正确”(对我来说),但它并不准确,根本。
【问题讨论】:
-
确保使用四个空格来格式化代码,以便获得带有语法突出显示的预格式化文本块。
-
我认为标签也能正常工作?
-
我认为从最后一段中可以看出?我应该得到“20”,但我得到“19.998630136986”;我不知道我在哪里失去了准确性。
-
永远不会是 20,因为您排除闰年的奇怪行为
-
ajreal - 我不明白你的意思。我只是删除了多余的闰年秒,你能解释一下吗(我们都知道它不是 20)?去除闰秒的奇怪行为在哪里?
标签: php strtotime leap-year seconds