- каждый понедельник месяца в PHP [дубликаты]
- 2 ответа
- PHP → Определить «первое воскресенье месяца»
- Комментарии
- Работа с датами
- Номер раз: strtotime
- Номер два: strftime
- Получить первый понедельник месяца для данного набора дат
- 5 ответов
- Как найти первый/последний понедельник месяца? PHP
- Как найти первый/последний понедельник месяца? 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 добавлен таким образом, чтобы соответствовать предостережению о том, что в предыдущие месяцы последний указанный день, если начало месяца прошло «в середине недели».
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 раз(а). [ Профиль ]