我使用以下代码:
public static function getDays($day, $m, $y) {
$days = new DatePeriod(
new DateTime("first $day of $m $y"),
DateInterval::createFromDateString('next ' . $day),
new DateTime("last day of $m $y")
);
foreach ($days as $day) {
$dates[] = $day->format("Y-m-d");
}
return $dates;
}大多数情况下都很管用。我给它一个范围,它返回我在范围内的每一天的日期。
用法:
foreach(General::getDays('friday',$this->_uri[2],$this->_uri[3]) as $date) {
var_dump($date);
}在2013年7月,这将返回正确的4个结果,所有星期五的结果在2013年7月:
string '2013-07-05' (length=10)
string '2013-07-12' (length=10)
string '2013-07-19' (length=10)
string '2013-07-26' (length=10)然而,在最后一天与我之后的一天(例如2013年5月星期五和2014年1月)相匹配的一个月里,它从返回的结果中错过了这个月的最后一天。
2013年5月的结果,当然是错过了第31次,也就是星期五:
string '2013-05-03' (length=10)
string '2013-05-10' (length=10)
string '2013-05-17' (length=10)
string '2013-05-24' (length=10)有人能回答这个问题吗?这是我对DateInterval的误用还是这门课的真正错误?
发布于 2013-07-26 21:46:58
问题是结束日期/时间本身从未包含在周期中--也就是说,DatePeriod对象表示[$startDate, $endDate)范围中的日期/时间。
您必须将至少1秒的时间添加到结束日期,才能始终得到预期的结果。但我们不要吝啬,加一整分钟:
$days = new DatePeriod(
new DateTime("first $day of $m $y"),
DateInterval::createFromDateString('next ' . $day),
new DateTime("last day of $m $y 00:01")
);除非您使用DatePeriod::EXCLUDE_START_DATE选项,否则开始日期本身也会被排除在外。
https://stackoverflow.com/questions/17891477
复制相似问题