Php первый понедельник месяца

каждый понедельник месяца в PHP [дубликаты]

На декабрь — 2014 (1-12-2014, 8-12-2014, 15-12-2014, 22-12-2014, 29-12-2014) и За январь — 2015 (29-12-2014, 5-1-2015, 12-1-2015, 19-1-2015, 26-1-2015) За февраль — 2015 (2-2-2015,9-2-2015,16-2-2015,23-2-2015) За ноябрь — 2014 (27-10-2014, 3-11-2014,10-11-2014,17-11-2014,24-11-2014,)

В сценарии, если первый день месяца посередине недели, чем в последний месяц в понедельник. В этот скрипт начинается неделя с понедельника по воскресенье. Ans:

1) < $previousmonth=date('F Y',strtotime($selectedmonth."-1 month")); $firstMonday=strtotime("last monday of ".$previousmonth); >else < $firstMonday=strtotime("first monday of ".$selectedmonth); >$temp=$firstMonday; $s="(".date("Y-m-d",$firstMonday).","; $lastmonday=strtotime("last monday of ".$selectedmonth); while($temp!=$lastmonday) < $temp=strtotime(date("d F Y",$temp)."+1 week"); $s.=date("Y-m-d",$temp).","; >$s=trim($s,",").")"; echo $s; ?> 

2 ответа

Вы можете создать функцию, которая создаст объект \DateTime в первый понедельник месяца. Затем в цикле while повторяется в течение дней (с шагом в 7 дней) и \DateTime объект \DateTime до достижения следующего месяца.

С помощью этой функции вы также можете указать день, когда хотите собрать массив.

/** * Get an array of \DateTime objects for each day (specified) in a year and month * * @param integer $year * @param integer $month * @param string $day * @param integer $daysError Number of days into month that requires inclusion of previous Monday * @return array|\DateTime[] * @throws Exception If $year, $month and $day don't make a valid strtotime */ function getAllDaysInAMonth($year, $month, $day = 'Monday', $daysError = 3) < $dateString = 'first '.$day.' of '.$year.'-'.$month; if (!strtotime($dateString)) < throw new \Exception('"'.$dateString.'" is not a valid strtotime'); >$startDay = new \DateTime($dateString); if ($startDay->format('j') > $daysError) < $startDay->modify('- 7 days'); > $days = array(); while ($startDay->format('Y-m') modify('+ 7 days'); > return $days; > 
$days = getAllDaysInAMonth(2015, 01); foreach ($days as $day) < echo $day->format('D Y-m-d').'
'; >
Mon 2014-12-29 Mon 2015-01-05 Mon 2015-01-12 Mon 2015-01-19 Mon 2015-01-26 

ПРИМЕЧАНИЕ. $daysError добавлен таким образом, чтобы соответствовать предостережению о том, что в предыдущие месяцы последний указанный день, если начало месяца прошло «в середине недели».

Читайте также:  Proxy server using java

Источник

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 уже прошёл относительно дня недели $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

Комментарии

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

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

Пятница или суббота — всё=.
Если сегодняшнее число находится в промежутке от 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 $dayOfWeekFirstDayOfMonth = 7;

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

strtotime() — универсальная функция для работы со временем.

// первый понедельник января 2011
echo date(‘Y-m-d’, strtotime(«first Monday of January 2011»));

// второе воскресенье декабря 2011
echo date(‘Y-m-d’, strtotime(«second Sunday of December 2011»));

// третья суббота июля 2011
echo date(‘Y-m-d’, strtotime(«third Saturday of July 2011»));

Источник

Работа с датами

Часто приходится видеть, как начинается настоящий цирк, когда у PHP-программиста доходит дело до дат. Тут и самописные волшебные функции, которые что-то там вычисляют и постоянно спотыкаются на границе месяцев или годов, или на переводе часов на зимнее/летнее время, тут и таинственное использование встроенных функций, с бубнами и плясками.

А надо-то, на самом деле, почти всегда совсем немного.

Под катом — пара полезных, на мой взгляд, советов для начинающих программистов.

Номер раз: strtotime

Все просто: даем этой функции текстовое описание даты, получаем на выходе таймстамп. Хинты здесь такие (это, в общем, для тех, кому лень сходить по ссылке):
1. использование относительных описаний даты (например: «-1month» — текущая дата минус 1 месяц, «+1year +1month» — текущая дата плюс 1 год и 1 месяц)
2. использование второго, необязательного параметра $now — это таймстамп, относительно которого рассчитывается дата. Например, выведем дату — пятницу следующей недели:

$now = strtotime("this sunday"); print strftime("%c", strtotime("next friday", $now));

Почему здесь нельзя было воспользоваться простым strtotime(«next friday»)? Да потому, что если сегодня, скажем, четверг, то strtotime(«next friday») — вернет нам таймстамп ближайшей пятницы — то есть пятницы этой недели, а это не то, что нам нужно (правда, мы могли бы использовать strtotime(«next week friday»), но тсс).

Еще пример. Вычислим дату — первый понедельник следующего месяца.

$next_month_fisrt_day = date("Y-m-01", strtotime("next month")); $next_month_fisrt_monday_ts = strtotime("this monday", strtotime($next_month_fisrt_day)); print strftime("%c", $next_month_fisrt_monday_ts)."\n";

Номер два: strftime

Эта функция возвращает отформатированную с учетом текущей локали дату в заданном формате. Часто это может помочь, например, отказаться от использования массивов с названиями месяцев — в пользу встроенных возможностей языка.

Источник

Получить первый понедельник месяца для данного набора дат

У меня есть определенный список дат. Я хочу получить первый понедельник каждого свидания.

Например: предположим, что данные даты

 2013-07-05 2013-08-05, 2013-09-13 etc. 

Я хочу получить первый понедельник из всех этих дат так, чтобы результат

 2013-07-01, 2013-08-05, 2013-09-02 respectively 

Я на самом деле застрял с этим, используя stftime ,

strftime("%d/%m/%Y", strtotime("first Monday of July 2012")); 

5 ответов

Использование php класса Datetime:

$Dates = array('2013-07-02', '2013-08-05', '2013-09-13'); foreach ($Dates as $Date) < $test = new DateTime($Date); echo $test->modify('first monday')->format('Y-m-d'); > 
 > > echo find_the_first_monday('2013-07-05'), "\n"; echo find_the_first_monday('2013-08-05'), "\n"; echo find_the_first_monday('2013-09-13'), "\n"; // output: // 2013-07-01 // 2013-08-05 // 2013-09-02 

Первый понедельник будет в течение первых 7 дней месяца, DAYOFWEEK(date) возвращает 1= воскресенье, 2= понедельник и т. д.

Я знаю, что это старый вопрос, и мой ответ не является 100% -ным решением этого вопроса, но это может быть полезно для кого-то, это даст «первую субботу данного года / месяца»:

date("Y-m-d", strtotime("First Saturday of 2021-08")); // gives: 2021-08-07 

Вы можете манипулировать этим разными способами.

очевидно, вы можете поставить «Вторая суббота года-месяца», и он тоже найдет это.

Вы можете перебрать массив дат, а затем выйти из цикла и вернуть $Date когда вы впервые встретитесь в понедельник

$Dates = array('2013-07-02', '2013-08-05', '2013-09-13'); foreach ($Dates as $Date) < $weekday = date('l', strtotime($Date)); if($weekday == 'Monday') < echo "First Monday in list is - " . $Date; break; >> 

First Monday in list is — 2013-08-05

Источник

Как найти первый/последний понедельник месяца? PHP

Как найти первый/последний понедельник месяца? PHP

Admin » 18.04.2016, 18:11 » Сообщение: #1

Код: Выделить всё Развернуть /**
* @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 $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
..Смерть стоит того чтобы жить, а любовь стоит того чтобы ждать..
Admin

Сообщения: 6372 [в теме] Откуда: Москва Группа: Администраторы Благодарил (а): 26 раз(а). Поблагодарили: 185 раз(а). [ Профиль ]

Источник

Оцените статью