5

我正在使用以下代码:

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 的误用还是这个类的真正错误?

4

1 回答 1

8

问题是结束日期/时间本身永远不会包含在该期间内——也就是说,该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选项,在这种情况下,开始日期本身也被排除在外

于 2013-07-26T21:46:58.937 回答