1

我尝试获取两个日期之间的天数,例如:

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

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

4

4 回答 4

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');
于 2013-09-25T15:56:26.493 回答
3

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

于 2013-09-25T16:04:42.207 回答
1

为什么?

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

您会得到这种结果,因为您使用的是使用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正确处理闰年和 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
于 2013-09-29T19:52:39.607 回答
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);
于 2013-09-25T16:22:01.473 回答