【发布时间】:2014-12-26 10:31:39
【问题描述】:
虽然使用 DateTime DateInterval 和 DatePeriod 来计算两个日期之间的间隔,但在使用 P1W(周)和 P1M(月)时,我遇到了一些意想不到的结果。
如果我们得到 9 月 30 日到 10 月 29 日之间的月份,它只会输出“Sep”。将结束日期更改为 10 月 30 日会输出“Sep”和“Oct”。我的第一个想法是也许它需要是本月的最后一天,但当然,10 月有 31 天......
$dateStart = '2014-09-30 00:00:00';
$dateEnd = '2014-10-29 23:59:59'; // Sep
// $dateEnd = '2014-10-30 23:59:59'; // Sep, Oct
// $dateEnd = '2014-10-31 23:59:59'; // Sep, Oct
$dateInt = 'M';
$start = new DateTime($dateStart);
$end = new DateTime($dateEnd);
$interval = new DateInterval('P1'.$dateInt);
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $day) {
var_dump($day->format($dateInt));
}
在尝试获取两个日期之间的周数时会发生同样的事情。将结束日期设置为 10 月 27 日星期一,结果中不包括该周 (44)。但是,将结束日期更改为 10 月 28 日星期二,确实包括第 44 周。
$dateStart = '2014-09-30 00:00:00';
$dateEnd = '2014-10-27 23:59:59'; // Monday - 40, 41, 42, 43
// $dateEnd = '2014-10-28 23:59:59'; // Tuesday - 40, 41, 42, 43, 44
// $dateEnd = '2014-10-29 23:59:59'; // Wednesday - 40, 41, 42, 43, 44
$dateInt = 'W';
$start = new DateTime($dateStart);
$end = new DateTime($dateEnd);
$interval = new DateInterval('P1'.$dateInt);
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $day) {
var_dump($day->format($dateInt));
}
有谁知道这是否是一个已知的错误?如果是这样/如果不是,有没有人知道最好的解决方法/修复?
【问题讨论】:
-
2014-09-30+1month=2014-10-30。由于您的$end日期早于(或等于)2014-10-30,因此您只会得到一个句点。这不是错误,这是它的工作原理。 -
@Glavić 好点。不敢相信我没有想到。我已经更新了我的“解决方法”来解释这就是为什么这让我绊倒了。