strtotime / 86400甚至没有返回天数

时间:2011-07-14 01:02:15

标签: php

我在PHP Version 5.3.1中得到了一个奇怪的结果,有人能解释下面的结果吗?

$secondsDiff = strtotime(date("2011-11-10")) - strtotime('2011-07-15');
return ($secondsDiff/86400);

它返回117.958333333 ??

当我使用更接近的日期时,它通常会起作用。

我查看了文档,但是找不到任何对此的引用。这是一个已知的PHP错误,我只需要学会与之共存或者我错过了一些非常明显的东西吗?

4 个答案:

答案 0 :(得分:6)

这可能是由于DST开关,它会将周期长度增加或减少一个小时。

这可以通过舍入来解决,或者 - 更优雅地 - 通过PHP 5.3的新奇DateInterval class来设置,它可以将句点格式化为天和更多。

从手册中窃取:

<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
?>

答案 1 :(得分:1)

不要将秒数除以86400秒。它肯定会在大部分时间工作,但在某些情况下它会返回一个丑陋的数字。这就是这里发生的事情。通常的罪魁祸首是进入或退出夏令时。

执行此操作的缓慢方法是使用循环并调用mktime();现代的方法是使用DateInterval类。

答案 2 :(得分:0)

strtotime()函数使用TZ环境变量。这意味着当您转换该日期时,最终会得到一个不完全在午夜的时间戳,除非您碰巧为GMT设置了您的时区。

因此,如果您所在的地区有夏令时,那么11月份的日期将比7月份的时间减少一个小时。您可以使用您提供的两个日期轻松测试。在我的服务器上,一个出现在凌晨4点,另一个出现在各自日期的凌晨5点。

答案 3 :(得分:0)

另一种解决方案:在

中添加UTC到字符串
$datetime1 = new DateTime('2009-10-11 UTC');
$datetime2 = new DateTime('2009-10-13 UTC');