КОНТЕКСТ: Мой клиент, местный кинотеатр, устраивает воскресный специальный утренник каждое второе воскресенье, начиная со ВТОРОГО воскресенья каждый год. Так что для этого года даты 1/11, 1/18, 2/8, 2/22, …. [Единственное исключение — воскресенье после их кинофестиваля, который проводит ТРЕТЬЮ НЕДЕЛЮ ОКТЯБРЯ, но автоматизирует это единственное исключение — «будь хорошим», не обязательным.]
УРОВЕНЬ МОЕГО НАВЫКА: НАЧИНАЮЩИЙ (мне нужна ваша помощь!) Я считаю, что мне нужно использовать комбинацию mktime () и date (), но я не знаю, как их собрать.
ЧТО Я ПОПРОБОВАЛ: Я подозреваю, что ответ является комбинацией того, что я вижу на этих трех должностях:
(1) цикл do-while для получения определенного дня недели из диапазона дат
(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;
}
СЛЕДУЮЩИЙ К ФИГУРЕ: напишите оператор, чтобы найти в массиве воскресений первую дату после текущей даты.
Это довольно ручное, процедурное решение, но оно должно работать.
<?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;
}
Других решений пока нет …