2

我正在使用以下几行来计算 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);

非常感谢您对此提供的任何帮助,蒂姆。

4

2 回答 2

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新的开始日期,所以我无法直接解决这个问题。

于 2014-05-15T13:29:11.887 回答
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);
}
于 2014-05-15T13:40:03.990 回答