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 = 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 に答える
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 に答える