我编写一个脚本,根据开始和结束时间之间设置的标准填充一系列日期。
我基本上使用php日期函数(http://php.net/manual/en/datetime.formats.relative.php)中的相对格式。
我的脚本首先根据用户的选择获取间隔:
//first get the interval
$event_repeatmonth = $_POST['event_repeatmonth'];
if ($event_repeatmonth == 1){ $interval = 'first';}
if ($event_repeatmonth == 2){ $interval = 'second';}
if ($event_repeatmonth == 3){ $interval = 'third';}
if ($event_repeatmonth == 4){ $interval = 'fourth';}
if ($event_repeatmonth == 5){ $interval = 'fifth';}
if ($event_repeatmonth == 6){ $interval = 'last';}
$onthe_monday = $_POST['onthe_monday'];
$onthe_tuesday = $_POST['onthe_tuesday'];
$onthe_wednesday = $_POST['onthe_wednesday'];
$onthe_thursday = $_POST['onthe_thursday'];
$onthe_friday = $_POST['onthe_friday'];
$onthe_saturday = $_POST['onthe_saturday'];
$onthe_sunday = $_POST['onthe_sunday'];
if ($onthe_monday == 1){ $interval_period[] = $interval." Monday";}
if ($onthe_tuesday == 1){ $interval_period[] = $interval." Tuesday";}
if ($onthe_wednesday == 1){ $interval_period[] = $interval." Wednesday";}
if ($onthe_thursday == 1){ $interval_period[] = $interval. " Thursday";}
if ($onthe_friday == 1){ $interval_period[] = $interval. " Friday";}
if ($onthe_saturday == 1){ $interval_period[] = $interval. " Saturday";}
if ($onthe_sunday == 1){ $interval_period[] = $interval. " Sunday";}
然后它将循环开始和结束日期内的日期。它将获取该月的第一个日期作为参考日期,并找到该月的相应的第1 /第2 /第3个星期一/星期二...:
//loop through to insert the array
while ($tmp <= $event_udate){
$tmpmonth = date("Y-m", strtotime($tmp))."-01";
//get proper date based on the intervals we are looking for
foreach ($interval_period AS $period){
$tmp = date("Y-m-d", strtotime($period, strtotime($tmpmonth)));
echo $period."--".$tmp."--".$tmpmonth."<br/>";
//sometimes the first interval will be before the start date, skip that
if ($tmp >= $event_sdate){
$event_datearray[] = $tmp;
}
}
//reset if reach end of the month
if ($repeat_every > 1){
//go to next month
$tmp = date('Y-m-d', strtotime('+'. $repeat_every.' month', strtotime($tmp)));
}else{
//go to next month
$tmp = date('Y-m-d', strtotime('+1 month', strtotime($tmp)));
}
}
例如,在这里,我要求该计划在2015年4月1日至2015年8月30日的时间范围内每3个月获得第二个星期三和第二个星期日。
结果应该已经返回:4 / 8,4 / 12,7 / 8和7/12。然而,似乎自4/1和7/1在星期三,它跳过了第一周并取代了第三个星期三。
我的回音结果如下所示,正如你所看到的,它在2015-04-01的第2个星期三抓到了4/15 ....并且在2015-07-01的第2个星期三抓住了7/15。 ..
second Wednesday--2015-04-15--2015-04-01
second Sunday--2015-04-12--2015-04-01
second Wednesday--2015-07-15--2015-07-01
second Sunday--2015-07-12--2015-07-01
array(4) { [0]=> string(10) "2015-04-15" [1]=> string(10) "2015-04-12" [2]=> string(10) "2015-07-15" [3]=> string(10) "2015-07-12" }
我在这里很丢失。这似乎仅在本月的第一天符合其中一个标准时才会出现问题。如果我将其更改为第2个星期四和第2个星期日,那么它将正确返回:
second Thursday--2015-04-09--2015-04-01
second Sunday--2015-04-12--2015-04-01
second Thursday--2015-07-09--2015-07-01
second Sunday--2015-07-12--2015-07-01
array(4) { [0]=> string(10) "2015-04-09" [1]=> string(10) "2015-04-12" [2]=> string(10) "2015-07-09" [3]=> string(10) "2015-07-12" }
有没有人在???之前有同样的问题
答案 0 :(得分:0)
我在发布之后想出来了......
事实证明,PHP日期中的相对格式不包括它所引用的日期。例如,如果您正在寻找2015-04-01的第二个星期一,它将查找2015-04-01之后的第一个星期一的第一个实例...
所以要解决这个问题,我只是检查一下这个月的第一个是否符合我要求的标准,如果是,那么将我的参考日改为前一天,以便考虑原始日期。