我需要为我的项目使用date_default_timezone_set,在我开始使用date_diff之前,一切都很好,因为它会根据所选时区产生好的和坏的结果。一个例子:
date_default_timezone_set('America/Los_Angeles');
$first = date_create("2016-10-01");
$last = date_create("2016-10-31");
$diff = date_diff($first, $last);
echo $diff->d;
结果是30,这是正确的。现在,如果我将时区设置为欧洲:
date_default_timezone_set('Europe/London');
结果为0。怎么回事?
如果您var_dump($diff)
,您将看到天数已重置为零,月份已增加为1:
object(DateInterval)#3 (15) {
["y"]=>
int(0)
["m"]=>
int(1)
["d"]=>
int(0)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["weekday"]=>
int(0)
["weekday_behavior"]=>
int(0)
["first_last_day_of"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
int(30)
["special_type"]=>
int(0)
["special_amount"]=>
int(0)
["have_weekday_relative"]=>
int(0)
["have_special_relative"]=>
int(0)
}
这可能是因为伦敦在10月的最后一个星期天从夏令时改回了夏令时。然而,日期差异的计算显然使其成为一个"月",而不是30天。
您可以通过使用days
属性来克服这一问题,该属性将报告30:
$first = date_create("2016-10-01");
$last = date_create("2016-10-31");
$diff = date_diff($first, $last);
echo $diff->days;