首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateInterval未返回本月的最后一天

问DateInterval未返回本月的最后一天
EN

Stack Overflow用户
提问于 2013-07-26 21:39:25
回答 1查看 2.8K关注 0票数 5

我使用以下代码:

代码语言:javascript
复制
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;
}

大多数情况下都很管用。我给它一个范围,它返回我在范围内的每一天的日期。

用法:

代码语言:javascript
复制
foreach(General::getDays('friday',$this->_uri[2],$this->_uri[3]) as $date) {
  var_dump($date);
}

在2013年7月,这将返回正确的4个结果,所有星期五的结果在2013年7月:

代码语言:javascript
复制
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次,也就是星期五:

代码语言:javascript
复制
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的误用还是这门课的真正错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-26 21:46:58

问题是结束日期/时间本身从未包含在周期中--也就是说,DatePeriod对象表示[$startDate, $endDate)范围中的日期/时间。

您必须将至少1秒的时间添加到结束日期,才能始终得到预期的结果。但我们不要吝啬,加一整分钟:

代码语言:javascript
复制
$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选项,否则开始日期本身也会被排除在外。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17891477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档