时间戳功能出错

时间:2013-09-25 15:50:06

标签: php

我试着计算两个日期之间的天数,如:

$day = ( strtotime('25-09-2013') - strtotime('01-01-2009') ) / ( 24*60*60 );

结果返回是:“1727.9583333333”,怎么回事?!

4 个答案:

答案 0 :(得分:5)

尝试使用DateTime。它可以处理这个问题:

$date1 = new DateTime("01-01-2009");
$date2 = new DateTime("25-09-2013");
$interval = $date1->diff($date2);
echo "difference = " . $interval->format('%R%a days');

答案 1 :(得分:3)

我认为您获得不均衡结果的原因是与夏令时相关的问题。我相信在这两天之间,整天都是不均衡的。您的PHP代码没有任何问题。

答案 2 :(得分:1)

为什么?

  

结果返回是:“1727.9583333333”,怎么回事?!

您得到的结果是因为您使用的时区使用DST 夏令时

使用DST [蓝色] | DST不再使用[橙色] | DST从未使用过[红色]

“解决方案”?

如果你使用不使用DST的时区,你的结果将不会浮动:

date_default_timezone_set('Asia/Shanghai'); # not in DST
var_dump( (strtotime('25-09-2013') - strtotime('01-01-2009')) / (24*60*60) ); # int(1728)

date_default_timezone_set('Europe/Berlin'); # in DST
var_dump( (strtotime('25-09-2013') - strtotime('01-01-2009')) / (24*60*60) ); # float(1727.9583333333)

以上示例用于全局设置时区,但您可以在本地设置时间为UTC的天数:

var_dump( (strtotime('25-09-2013 UTC') - strtotime('01-01-2009 UTC')) / (24*60*60) ); # int(1728)

我始终建议使用DateTime代替 mktime() strtotime()和类似的功能。 DateTime正确处理闰年和夏令时。

$f = new DateTime('01-01-2009');
$t = new DateTime('25-09-2013');
var_dump( $f->diff($t)->days ); # int(1728)

# Or one-liner (PHP >= 5.4) :
echo (new DateTime('01-01-2009'))->diff(new DateTime('25-09-2013'))->days; # 1728

答案 3 :(得分:0)

你需要在使用strtotime功能之前设置时区

date_default_timezone_set('UTC');
$day = ( strtotime('25-09-2013') - strtotime('01-01-2009') ) / ( 24*60*60 );

如果您需要保留时区以便进一步处理,那么您可以分别在上面的代码之前和之后使用get和set命令

$my_tz = date_default_timezone_get();

以后

date_default_timezone_set($my_tz);