我有一些代码在特定日期开始的10年范围内每一天循环。只有当它符合表单中的选定标准时才应添加该日期。根据开始日期确定日期是否为隔周的一部分
该表格包含可供选择月份和工作日的字段。在每个工作日内,每个工作日都有选项,第一,第二等。我在每个工作日添加一个“其他”选项以及一个开始日期字段。
我试图确定最好的方法来检查当前日期是否在基于开始日期的“其他”条件之内。
看了其他问题后,我找不到一个理想的答案,考虑了53周的一年。我能够想出一些似乎给我准确结果的测试代码,但我想知道是否有更简单的方法来执行此检查。
测试代码:
// set start date
$date = new \DateTime('2019-12-15');
// get start date week of year and modulus
$start_week = date('W', $date->getTimestamp());
$start_mod = $start_week % 2;
// set end time (10 years from start date)
$end_time = strtotime('+10 years', $date->getTimestamp());
// init previous year and week modifier
$prev_year = false;
$week_modifier = 1;
// each day in range
while($date->getTimestamp() <= $end_time){
// get year
$y = $date->format('Y');
// previous year doesn't match current year
if($prev_year != $y){
// previous year set
if($prev_year){
// get number of weeks in year
$weeks_in_year = date('W', mktime(0, 0, 0, 12, 28, $prev_year));
// year has odd number of weeks
if($weeks_in_year % 2){
// increment week modifier
$week_modifier++;
}
}
// update previous year
$prev_year = $y;
}
// get week of year
$w = $date->format('W') + $week_modifier;
// check if meets every other criteria (based on start date)
$every_other = false;
if(($w % 2) == $start_mod){
$every_other = true;
}
// print date if it is part of every other Tuesday
if($date->format('w') == 2 && $every_other){
echo $date->format('Y-m-d');
echo '<br/>';
}
// increment day
$date->modify('+1 day');
}
注1:2020是明年,其中有53个星期。注意2:我在这个测试代码中有一个错字,它正在递增星期修饰符而不是初始化为0.如果修饰符被初始化为0,那么这个代码将起作用更有意义,而是只在初始化为奇数时才起作用。
我会考虑看看这个项目:https://github.com/simshaun/recurr它非常适合处理复发,这显示了一些你可以使用的RRULE字符串的例子:http://www.kanzaki.com/docs/ical/ rrule.html – Theo
...每隔一个星期一的字符串的缩减版本看起来像这样'FREQ = WEEKLY; INTERVAL = 2; BYDAY = MO'(你可以包括开始和结束日期以及更多) – Theo
Thanks @Theo。我不知道Recurr。我一定会仔细看看这个解决方案和其他几个日期标准问题! –