我尝试获取两个日期之间的天数,例如:
$day = ( strtotime('25-09-2013') - strtotime('01-01-2009') ) / ( 24*60*60 );
结果返回是:“1727.9583333333”,怎么会?!
我尝试获取两个日期之间的天数,例如:
$day = ( strtotime('25-09-2013') - strtotime('01-01-2009') ) / ( 24*60*60 );
结果返回是:“1727.9583333333”,怎么会?!
尝试使用DateTime
. 它处理得更整洁:
$date1 = new DateTime("01-01-2009");
$date2 = new DateTime("25-09-2013");
$interval = $date1->diff($date2);
echo "difference = " . $interval->format('%R%a days');
我相信您得到不均匀结果的原因是与夏令时相关的问题。我相信在这两天之间有不均匀的整天。您的 PHP 代码没有任何问题。
结果返回是:“1727.9583333333”,怎么会?!
使用夏令时 [蓝色] | 不再使用 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正确处理闰年和 DST。
$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
您需要在使用 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);