xandeadx.ru Блог музицирующего веб-девелопера

PHP → Определить "первое воскресенье месяца"

Опубликовано в

Задача — узнать день месяца у "первого воскресенья августа", "второго понедельника сентября" и т.д.:

/**
 * @param integer $weekNumber Номер недели.
 * @param integer $dayOfWeek Порядковый номер дня недели.
 * @param integer $monthNumber Порядковый номер месяца.
 * @param integer $year Год.
 * @return integer День месяца.
 */
function compute_day($weekNumber, $dayOfWeek, $monthNumber, $year)
{
    // порядковый номер дня недели первого дня месяца $monthNumber
    $dayOfWeekFirstDayOfMonth = date('w', mktime(0, 0, 0, $monthNumber, 1, $year));
 
    // сколько дней осталось до дня недели $dayOfWeek относительно дня недели $dayOfWeekFirstDayOfMonth
    $diference = 0;
 
    // если нужный день недели $dayOfWeek только наступит относительно дня недели $dayOfWeekFirstDayOfMonth
    if ($dayOfWeekFirstDayOfMonth <= $dayOfWeek)
    {
        $diference = $dayOfWeek - $dayOfWeekFirstDayOfMonth;
    }
    // если нужный день недели $dayOfWeek уже прошёл относительно дня недели $dayOfWeekFirstDayOfMonth
    else
    {
        $diference = 7 - $dayOfWeekFirstDayOfMonth + $dayOfWeek;
    }
 
    return 1 + $diference + ($weekNumber - 1) * 7;
}

Примеры:

// первый понедельник января 2011
echo compute_day(1, 1, 1, 2011); // 3
 
// второе воскресенье декабря 2011
echo compute_day(2, 7, 12, 2011); // 11
 
// третья суббота июля 2011
echo compute_day(3, 6, 7, 2011); // 16
Похожие записи

Комментарии RSS

А как высчитать какая это, например, пятница месяца первая или третья
например "второе воскресенье" месяца

А как высчитать какая это, например, пятница месяца первая или третья
например "второе воскресенье" месяца

Пятница или суббота - всё=.
Если сегодняшнее число находится в промежутке от 1-го до 7-го, то текущий день недели ещё не повторялся в этом месяце, т.е. это первая суббота или первое воскресенье. Если сегодня 10-е число, значит этот день недели повторился дважды, т.к. текущее число месяца лежит в промежутке от 8-го до 14-го.
Ну, я думаю, что суть ясна (в течении 7 дней день недели не повторится дважды).
Почти по томуже принципу ищется "последняя ли эта пятница в месяце?"
К текущему числу месяца прибавляем 7, если получившаяся сумма больше чем количество дней в этом месяце, то это последняя пятница.
Ну, вот, как-то так...

//перша неділя червня
echo compute_day(1, 7, 6, 2014); // 8 а має бути 1

потрібно так
$dayOfWeekFirstDayOfMonth = date('w', mktime(0, 0, 0, $monthNumber, 1, $year));

if ($dayOfWeekFirstDayOfMonth <= 0)
$dayOfWeekFirstDayOfMonth = 7;

А обратно не поможете высчитать?
То есть определить какой день чего сегодня?

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании