У меня возникли проблемы с вычислением даты. Я постараюсь объяснить это как можно больше;
Допустим, у вас есть рекламный щит, и этот носитель имеет активный диапазон дат. Например, начало активного срока — 1 декабря каждого года, а конец активного срока — 1 марта каждого года.
Учтите, что вы арендуете этот рекламный щит кому-то на определенный срок. Примером диапазона дат является период с 1 февраля 2017 года по 10 декабря 2020 года. Как в этом периоде я могу рассчитать количество оплачиваемых дат? Попытка сделать это с php, но застрял. Кто-нибудь может помочь мне сделать это, не имея слишком много предложений «если»?
редактировать:
$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...
Задача ещё не решена.
Других решений пока нет …