我使用以下行来计算PHP中的4周间隔。
这使用固定日期($calStart
)作为计算的基础,并结束所选年份的最后一天($rangeEnd
/ $selYear
)的间隔,该间隔到目前为止效果很好。
示例:如果所选年份是2015年,而不是我的范围中的第一个日期,则应将2015-01-16作为所选年份的第一个间隔日期。
有人可以告诉我如何设置这个,以便$rangeDays
仅从所选年份的第一个间隔日期开始,而不是返回自$calStart
日期以来的所有间隔(这就是它的作用)此刻)?
$calStart = new DateTime('2014-01-17');
$interval = DateInterval::createFromDateString('4 weeks');
$rangeEnd = new DateTime($selYear . '-12-31');
$rangeDays = new DatePeriod($calStart, $interval, $rangeEnd);
非常感谢你提供任何帮助,蒂姆。
答案 0 :(得分:1)
如果您希望$calStart
在$rangeEnd
的同一年开始,这应该为您完成:
$calStart = new DateTime('2014-01-17');
if ($selYear !== $calStart->format('Y')) {
$calStart->setDate($selYear , $calStart->format('n'), $calStart->format('j'));
}
$interval = DateInterval::createFromDateString('4 weeks');
$rangeEnd = new DateTime($selYear . '-12-31');
$rangeDays = new DatePeriod($calStart, $interval, $rangeEnd);
我不确定如何将2015-01-16
作为新的开始日期,因此我无法直接解决此问题。
答案 1 :(得分:1)
您可以尝试:
$calStart = new \DateTime('2014-01-17');
$calYear = $calStart->format('Y');
if ($selYear !== $calYear) {
$day = (int) $calStart->format('z') + date('z', mktime(0,0,0,12,31,$calYear)) * ($selYear - $calYear);
$calStart->setDate($selYear, 1, $day % 28);
}
编辑:
这个更复杂:
$calStart = new \DateTime('2014-01-17');
$calYear = (int) $calStart->format('Y');
if ($selYear !== $calYear) {
$days = (int) $calStart->format('z') + 1; // get day in a year. +1 is because it starts with 0
for ($i = $calYear; $i < $selYear; $i++) {
$days -= (date('z', mktime(0,0,0,12,31,$i)) + 1) % 28; // remove from start day a modulo of 28 days, every year the date is lower
}
if ($days < 0) {
$days += 28; // if we will finish with value under 0, just add 4 weeks
}
$calStart->setDate($selYear, 1, $days);
}