【问题标题】:PHP strtotime without leap-yearsPHP strtotime 没有闰年
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你应该将计算中的1968(它来自哪里?)替换为unix时间的原点:1970,你会得到更准确的结果。

    编辑

    您必须使用intval 来计算闰年的数量,该数量必须是整数:

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

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

    【讨论】:

    • 每四年有一个闰年,1972、1976、1980...来计算从1970年到Y年的闰年数量,我用这个:round((Y-1968)/4)例子:(1976-1968)/4 =2。原因是 1970 (unix) 与闰年不一致,因此我将其减少到“闰年 0”,即 1968 年。
    • 尝试了您的建议,我确实得到了准确的结果。我更困惑:(
    • 我已经“增加了赌注”,从 +20 到 +60 年,并且......我得到了准确的结果。尝试 +80,结果为 0(而我的结果为负数)。
    • 如果年份的数字以两位数格式指定,则 00-69 之间的值映射到 2000-2069 和 70-99 到 1970-1999。 ...在 32 位系统上可能存在差异(可能的日期可能在 2038-01-19 03:14:07 结束)。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2015-07-06
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多