2011-07-14 30 views
1

我对PHP 5.3.1版有一个奇怪的结果,任何人都可以解释下面的结果吗?strtotime/86400不返回偶数天

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

它返回117.958333333?

当我将日期靠得更近时,它通常会起作用。

我查看了文档,但找不到任何参考。这是一个已知的PHP错误,我只需要学习生活,或者我错过了一些非常明显的东西?

回答

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'); 
?> 
+0

感谢佩卡!使用DateInterval很好地解决了问题:) – Nick

1

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

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

0

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

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

0

另一种解决方案:加UTC的字符串作为

$datetime1 = new DateTime('2009-10-11 UTC'); 
$datetime2 = new DateTime('2009-10-13 UTC');