Datetime 带有日期周期的时态表达式?

Datetime 带有日期周期的时态表达式?,datetime,php-5.3,Datetime,Php 5.3,我正在尝试用PHP实现。和PHP对象看起来很适合处理时态表达式。问题是,我需要能够对DatePeriods执行并集、交集和差分操作,这样我就可以计算诸如“除偶数日期外的每个星期二”之类的表达式。该示例需要“每周二”日期周期和“偶数日期”日期周期的差值 DatePeriod是可编辑的,但是像array\u intersect()和array\u diff()这样的标准数组处理函数无法访问它。(我希望如此!)因此我尝试将DatePeriod更改为带有$ap=array\u到\u迭代器($dp)的数组

我正在尝试用PHP实现。和PHP对象看起来很适合处理时态表达式。问题是,我需要能够对DatePeriods执行并集、交集和差分操作,这样我就可以计算诸如“除偶数日期外的每个星期二”之类的表达式。该示例需要“每周二”日期周期和“偶数日期”日期周期的差值

DatePeriod是可编辑的,但是像
array\u intersect()
array\u diff()
这样的标准数组处理函数无法访问它。(我希望如此!)因此我尝试将DatePeriod更改为带有
$ap=array\u到\u迭代器($dp)
的数组。除了DatePeriod包含的DateTime对象没有
\uuu toString()
方法之外,它的工作原理与预期基本相同,这是许多数组函数所需要的

我最近的尝试最接近:

function recur_union($p1,$p2){
 $a1=(is_object($p1)) ? iterator_to_array($p1):$p1;
 $d_arr=recur_difference($p2,$a1);
 return array_merge($a1,$d_arr);
}

function recur_difference($p1,$p2){
 $arr=array();
 $a2=(is_object($p2)) ? iterator_to_array($p2):$p2;

 foreach($p1 as $dt){
  if(!in_array($dt,$a2))$arr[]=$dt;
 }
 return $arr;
}

$p1=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString( "+2 days" ),date_create('2008-12-31'));
$p2=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString( "+7 days" ),date_create('2008-12-31'));

$au=recur_union($p1,$p2);
$ad=recur_difference($p1,$p2);
echo $au, $ad;
不幸的是,似乎DatePeriods$p1和$p2在处理过程中被破坏了。如果我先执行
递归联合($p1,$p2)
,我会得到一个有效的结果。如果在
recur\u差异($p1,$p2)
之后执行,则
recur\u联合
返回一个空数组。同样的情况也会发生在
重复出现差异的情况下

问题#1:有人能解释为什么
迭代器_to_数组
似乎会删除原始的日期周期吗

因为我的约会周期被破坏了,我想我应该试着克隆它们。但以下情况会导致IE8显示“无法显示网页”消息,而FF3.5不执行任何操作:

$p1=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString( "+2 days" ),date_create('2008-12-31'));
$p2=new DatePeriod(date_create('2008-01-01'),DateInterval::createFromDateString( "+7 days" ),date_create('2008-12-31'));

$a1=clone $p1;
$a2=clone $p2;

$au=recur_union($p1,$p2);
$ad=recur_difference($a1,$a2);

echo $au, $ad;
问题2:克隆人怎么了


谢谢大家

去年我有一个类似的问题,不过对我来说,我很难将它与持久层联系起来。对于应用程序层,一种方法是将作业划分为一组处理集合操作(交集、并集、差分)的类和一组处理“时态表达式”(每个月的最后一天)的类。然后可以将时态类组合在一起,以生成任意复杂的日期条件


我已经写了关于这个主题的文章,并提供了示例类和。

这是一个有趣的例子。最后,我将DatePeriod扩展到了一个名为Recurse的类,该类可以像数组一样访问,而且克隆时没有任何问题。然后我创建了时态表达式类(并集、差分、相交),它们知道如何对递归对象执行集合操作。操作如何分组和排序的逻辑在更高级别上处理。