我正在使用以下代码:
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月,这将在2013年7月的所有星期五返回正确的4个结果:
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的错误使用还是这个类中的真正错误?
答案 0 :(得分:6)
问题是结束日期/时间本身从未包含在期间内 - 也就是说,DatePeriod
对象代表[$startDate, $endDate)
范围内的日期/时间¹。
您必须至少在结束日期添加一秒才能始终获得预期结果。但是,让我们不要吝啬并添加一分钟:
$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
选项,否则开始日期本身也会被排除