微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP DateInterval不返回该月的最后一天

我正在使用以下代码

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还是本课程中的真正错误

解决方法:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐