дата — PHP | Как найти КАЖДЫЙ ДРУГОЙ ВОСКРЕСЕНЬ со ВТОРОГО ВОСКРЕСЕНЬЯ ЭТОГО ГОДА до второго воскресенья СЛЕДУЮЩЕГО ГОДА

КОНТЕКСТ: Мой клиент, местный кинотеатр, устраивает воскресный специальный утренник каждое второе воскресенье, начиная со ВТОРОГО воскресенья каждый год. Так что для этого года даты 1/11, 1/18, 2/8, 2/22, …. [Единственное исключение — воскресенье после их кинофестиваля, который проводит ТРЕТЬЮ НЕДЕЛЮ ОКТЯБРЯ, но автоматизирует это единственное исключение — «будь хорошим», не обязательным.]

УРОВЕНЬ МОЕГО НАВЫКА: НАЧИНАЮЩИЙ (мне нужна ваша помощь!) Я считаю, что мне нужно использовать комбинацию mktime () и date (), но я не знаю, как их собрать.

ЧТО Я ПОПРОБОВАЛ: Я подозреваю, что ответ является комбинацией того, что я вижу на этих трех должностях:

(1) цикл do-while для получения определенного дня недели из диапазона дат

(2) здесь может быть ярлык для ссылки на второе воскресенье в ПРИНЯТОМ ОТВЕТЕ, но я не уверен, что это помогает

(3) НАИБОЛЕЕ СООТВЕТСТВУЮЩИЙ (?): Получите первое воскресенье каждого месяца

КОНЕЦ РЕЗУЛЬТАТА: Я хочу отобразить [Месяц] и [День] следующего воскресного утренника (поэтому я хочу найти и отобразить первый элемент в массиве ПОСЛЕ текущей даты). Текст будет выглядеть так: «Далее: [Месяц] [День]»

Есть смысл? Дайте мне знать, если я что-то забыл.

Если не так много вопросов, пожалуйста, объясните ваш код, чтобы я (и другие?) Могли учиться на этом; но я был бы более чем благодарен за «просто» прямое решение.

Большое спасибо.
Дебра

UPDATE / ПРОГРЕСС: Этот код получит мне массив воскресений:

$startDate = strtotime("second Sunday of ".date('Y')."");
for ($i=0; $i < 27; $i++){
$sundays = date('F j', ($startDate + (($i*14) * 24 * 3600))) . '<br>';
print $sundays;
}

СЛЕДУЮЩИЙ К ФИГУРЕ: напишите оператор, чтобы найти в массиве воскресений первую дату после текущей даты.

-3

Решение

Это довольно ручное, процедурное решение, но оно должно работать.

<?php
$SECS_PER_DAY = 86400;

# Find the first Sunday on or after a given timestamp
function firstSundayOnOrAfter($time) {
global $SECS_PER_DAY;

# What day of the week is the given date?
$wday = date('w', $time);

if ($wday == 0) {
# it's already a Sunday
return $time;
}

return $time + (7 - $wday) * $SECS_PER_DAY;
}

# return an array of timestamps representing
# (noon on) the special matinee Sundays for the given year
function specialMatineeSundays($year) {

global $SECS_PER_DAY;

# When's the film festival?
$oct1 = mktime(12,0,0,10,1,$year);
$festivalStart = firstSundayOnOrAfter($oct1);
$festivalSkip  = $festivalStart + 7 * $SECS_PER_DAY;

# find the first Sunday of the year
$jan1 = mktime(12,0,0,1,1,$year);
$sunday = firstSundayOnOrAfter($jan1);

# Add a week to start with the second Sunday
$sunday += 7 * $SECS_PER_DAY;

# Build up our result list
$result = [];

# As long as the Sunday under examination is still the same year,
# add it to the list (unless it's the post-festival skip date)
# and then add two weeks
while (date('Y',$sunday) == $year) {
if ($sunday != $festivalSkip) {
$result[] = $sunday;
}
$sunday += 14 * $SECS_PER_DAY;
}

return $result;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]