【发布时间】:2012-12-07 00:52:28
【问题描述】:
我不想知道如何做到这一点。我想知道为什么它没有给出预期的结果。
我尝试计算格式为 YYYY-mm-dd 的两个日期之间的天数 使用此代码:
$day1 = strtotime($_REQUEST['start']);
$day2 = strtotime($_REQUEST['end']);
$nbOfDays = $day2 - $day1;
$nbOfDays = ceil($nbOfDays/60/60/24);
echo $nbOfDays;
问题是当我计算 2012-12-01 和 2012-12-31 之间的差异时,它给了我 30 天(应该是 31) 而且 2012-11-01 和 2012-11-30 之间的差值也是 30(没错!)
更新纯信息:
我不得不修改这段代码(感谢贾斯汀):
$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$interval = round(abs($day2->format('U') - $day1->format('U')) / (60*60*24));
echo $interval;
为:
$day1 = new DateTime($_REQUEST['start']);
$day2 = new DateTime($_REQUEST['end']);
$nb1 = $day2->format('U');
$nb2 = $day1->format('U');
$interval = round(abs($nb1 - $nb2) / (60*60*24));
echo $interval;
因为
$day2->format('U') - $day1->format('U')
等于 0
所以最后,2012-12-31 和 2012-12-01 之间的差值仍然是 30。BUUUTTTT,2012-11-30 和 2012-11-01 之间的差值是 29,所以
echo $interval +1;
在任何情况下都给出正确的天数!
【问题讨论】:
-
好吧,我真的不想知道该怎么做。我想知道为什么某些日期的结果是正确的,而其他日期的结果却不正确。
-
1+30=31; 30 是正确的 12 月。 11 月似乎给出了 29.041,而你的上限是 30。不知道为什么它给出了这个数字..我认为 DST 开关是在 10 月..但也许还有其他类型的时间调整,它关闭了一个小时或所以。
-
(你们为什么不赞成他?他的问题表述得很好)
-
我认为这个问题所需的日期算术有点专业,因为 OP 似乎需要开始和结束日期跨越的天数,而不是 这些日期之间的差异(以天为单位)。 2012-12-01 和 2012-12-31 之间有 30 天,2012-11-01 和 2012-11-30 之间有 29 天,但 OP 分别需要 31 和 30 天。
strtotime()在 local 时间工作,因此将本地时区设置为 UTC 以避免任何夏令时差异抛出结果。