日付の計算に問題があります。できる限り説明しようと思います。
広告掲示板があり、この媒体に有効な日付範囲があるとします。たとえば、有効期間の開始は毎年 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...