0

日付の計算に問題があります。できる限り説明しようと思います。

広告掲示板があり、この媒体に有効な日付範囲があるとします。たとえば、有効期間の開始は毎年 12 月 1 日であり、有効期間の終了は毎年 3 月 1 日です。

この看板を誰かに一定期間貸しているとします。日付範囲の例は、2017 年 2 月 1 日から 2020 年 12 月 10 日までです。PHPでやろうとしましたが、行き詰まりました。「if」句をあまり使わずに、誰でもそれを行うのを手伝ってもらえますか?

編集:

    $activeTermStart = "01/12"; // 'd/m'
    $activeTermEnd = "01/03"; // 'd/m'

    $daterangeStart = new \DateTime('2017-02-01');
    $daterangeEnd = new \DateTime('2020-12-10');

    //check if active term start&end have year diff
    $hasYearDiffBetweenTermStartAndEnd = false;

    $startArray = explode('/',$activeTermStart);
    $endArray = explode('/',$activeTermEnd);
    if ($startArray[1]>$endArray[1]) {
        $hasYearDiffBetweenTermStartAndEnd = true;
    }
    if ($startArray[1]==$endArray[1] && $startArray[0]>=$endArray[0]) {
        $hasYearDiffBetweenTermStartAndEnd = true;
    }

    $startTermWithYear = \DateTime::createFromFormat('d/m/Y',$activeTermStart.'/'.date('Y'));
    $startTermWithFirstYear = \DateTime::createFromFormat('d/m/Y',$activeTermStart.'/'.$daterangeStart->format('Y'));
    if ($hasYearDiffBetweenTermStartAndEnd) {
        $endTermWithYear = \DateTime::createFromFormat('d/m/Y',$activeTermEnd.'/'.(date('Y')+1));
        $endTermWithFirstYear = \DateTime::createFromFormat('d/m/Y',$activeTermEnd.'/'.((int)$daterangeStart->format('Y')+1);
    } else {
        $endTermWithYear = \DateTime::createFromFormat('d/m/Y',$activeTermEnd.'/'.date('Y'));
        $endTermWithFirstYear = \DateTime::createFromFormat('d/m/Y',$activeTermEnd.'/'.$daterangeStart->format('Y'));
    }

    $maximumBillableDaysPerYear = ($endTermWithYear->getTimestamp() - $startTermWithYear->getTimestamp())/60/60/24;

    $totalYearsToCheck = ((int)$daterangeEnd->format('Y') - (int)$daterangeStart->format('Y'))+1;

    $maximumBillableDaysTotal = $totalYearsToCheck *  $maximumBillableDaysPerYear;

    // from that moment on, i want to see how many days are not in the first year and
    // how many days are not in the last year. Remove them from the maximumBillableDaysTotal to
    // see how many days that billboard is billable for.
    // stucked here...
4

0 に答える 0