gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:03:14 26 4
gpt4 key购买 nike

我正在使用以下代码:

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

最佳答案

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

关于PHP DateInterval 不返回该月的最后一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17891477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com