我正在尝试确定一个
我的基本想法是反转
这似乎在同一方向上两次应用间隔,因此我尝试使用
有没有更好的想法? 除了选择一个远在开始日期之前的偏移量并向前迭代,直到我们匹配它或超过它,这种方法既丑陋又低效?
提前致谢!
DateTime
是否与可能出现的DateInterval
恰好重合。我使用的间隔需要允许'下个月的第N个X日'类型的格式规范,但我不确定在这些条件下是否可能实现这样的事情。我的基本想法是反转
DateInterval
,将其应用到原始DateTime
的克隆中,再将其放回原处,再次应用并检查两个DateTime
实例是否相等。如果相等,则表示它恰好处于该间隔上:public static function dateFallsOnPeriod(DateTime $date, DateInterval $interval)
{
$compare = clone $date;
// invert the period, apply it to the date, uninvert & then reapply
$interval->invert = 1;
$compare->add($interval);
$interval->invert = 0;
$compare->add($interval);
return $date == $compare;
}
这似乎在同一方向上两次应用间隔,因此我尝试使用
->sub()
和->add()
再次尝试,结果出现致命错误“DateTime :: sub():仅支持非特殊相对时间规范进行减法”。看起来这种功能根本没有实现。有没有更好的想法? 除了选择一个远在开始日期之前的偏移量并向前迭代,直到我们匹配它或超过它,这种方法既丑陋又低效?
提前致谢!
invert
执行了一个子程序,我测试过它。你的子程序和加法互相抵消了。在开头它检查$compare == $date。 反转(invert)执行子例程,我测试了它。 您的子例程和添加操作相互抵消。 在开头,它检查$compare == $date。 - DevZer0dateCoincidesWithInterval
或者类似的名字,抱歉造成困扰。 @DevZer0:添加、减去和比较不总是互相抵消的原因是由于PHP允许一些特殊的间隔。所以如果你的间隔指定为“每月第一个星期天”,而你将星期一作为$date
传递进去,你就需要知道那个日期并不符合间隔条件。对于更常见的间隔,你所说的是正确的,这个方法其实并不需要,但是我想用这个方法来涵盖所有可能的情况。 - pospi