Захватите все среды в определенном месяце в PHP

Это функция, которую я пытаюсь написать:

function getWednesdays($month, $year) { // Returns an array of DateTimes representing all Wednesdays this month. } 

Есть идеи? Благодаря-

Related of "Захватите все среды в определенном месяце в PHP"

С PHP5.3

 function getWednesdays($y, $m) { return new DatePeriod( new DateTime("first wednesday of $y-$m"), DateInterval::createFromDateString('next wednesday'), new DateTime("last day of $y-$m") ); } 

Применение:

 foreach (getWednesdays(2010, 11) as $wednesday) { echo $wednesday->format("l, Ymd\n"); } 

Вывод:

 Wednesday, 2010-11-03 Wednesday, 2010-11-10 Wednesday, 2010-11-17 Wednesday, 2010-11-24 

Обратите внимание, что это исключает дату окончания, поэтому, если последний день $y-$m окажется средой, он не будет в списке. Вы должны добавить день до даты окончания, чтобы включить его. Чтобы включить его, измените относительный формат в дате окончания, чтобы

 new DateTime("next month $y-$m-01") 

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


С PHP <5.3

 function getWednesdays($y, $m) { $ts = strtotime("first wednesday $y-$m-01"); $end = strtotime("last wednesday $y-$m"); $wednesdays = array(); while($ts <= $end) { $wednesdays[] = $ts; $ts = strtotime('next wednesday', $ts); } return $wednesdays; } 

Применение:

 foreach (getWednesdays(2010, 11) as $wednesday) { echo date("l, Ymd\n", $wednesday); } 

Тот же вывод, что и выше ( Run on Codepad ).

Обратите внимание, что это не работает для какой-либо версии до 5.3 из-за изменений в парсере относительных форматов. Если вы хотите использовать это с PHP 5.3+, вы должны изменить first Wednesday $y-$m-01 до first Wednesday of $y-$m-01 (ум «из»). Кроме того, как и в версии DateTime, дата окончания не будет включена.


Дальнейшее чтение:

  • DateTime в руководстве PHP
  • Относительные форматы DateTime
  • Derick Rethans: расширенная обработка даты / времени (ZendCon 10)
  • Относительный элемент в строках даты ( зеркало )

Вы можете попробовать что-то вроде этого:

 function getWednesdays($month, $year) { $base_date = strtotime($year . '-' . $month . '-01'); $wed = strtotime('first wed of ' . date('F Y', $base_date)); $wednesdays = array(); do { $wednesdays[] = new DateTime(date('r', $wed)); $wed = strtotime('+7 days', $wed); } while (date('m', $wed) == $month); return $wednesdays; } 

Используйте эту функцию, чтобы получить общее количество дней в месяц

  function getTotalDays($year, $month, $day){ $from = $year."-".$month."-01"; $t=date("t",strtotime($from)); for($i=1; $i<$t; $i++){ if( strtolower(date("l",strtotime($year."-".$month."-".$i)))== $day){ $count++; } } return $count; } 

используйте это getTotalDays ('2014', '08', 'monday');

выйдет 4

Но если вы хотите, чтобы все даты в месяц в определенный день использовали эту функцию

  function getTotalDatesArray($year, $month, $day){ $date_ar=array(); $from = $year."-".$month."-01"; $t=date("t",strtotime($from)); for($i=1; $i<$t; $i++){ if( strtolower(date("l",strtotime($year."-".$month."-".$i)))== $day){ $j= $i>9 ? $i: "0".$i; $date_ar[]=$year."-".$month."-".$j; } } return $date_ar; } 

используйте этот getTotalDatesArray ('2014', '08', 'monday');

выведет Array ([0] => 2014-08-04 [1] => 2014-08-11 [2] => 2014-08-18 [3] => 2014-08-25)

Вероятно, есть более эффективный способ сделать это, но это работает:

 <?php function isWednesday($day, $month, $year) { if (date('w', $date = mktime(0,0,0,$month,$day,$year)) == 3) { return $date; } return false; } function getWednesdays($month, $year) { for ($day=1; $day<=7; $day++) { if ($date = isWednesday($day, $month, $year)) { break; } } $wednesdays = array(); while (date('m',$date) == $month) { $wednesdays[] = $date; $day += 7; $date = isWednesday($day, $month, $year); } return $wednesdays; } 

Вы можете проверить это:

 foreach (getWednesdays($argv[1], $argv[2]) as $date) { echo date("Ymd\n", $date); } $ php wednesdays.php 11 2010 2010-11-03 2010-11-10 2010-11-17 2010-11-24 $ php wednesdays.php 12 2010 2010-12-01 2010-12-08 2010-12-15 2010-12-22 2010-12-29 $ php wednesdays.php 2 2012 2012-02-01 2012-02-08 2012-02-15 2012-02-22 2012-02-29 

S

 <?php function wednesdays($month, $year) { list($n,$d) = explode('-', date('t-d', strtotime("Wednesday, $year-$month"))); $days = array(); while ($d <= $n) { $days[] = sprintf("%04d-%02d-%02d", $year, $month, $d); $d += 7; } return $days; } var_dump(wednesdays(11, 2010)); ?> 

Но я настоятельно рекомендую привыкнуть к функциям даты и времени PHP 5.3, если вы можете их использовать. (См. Ответ Гордона.)

С PHP раньше 5.3 это решение не работает. Кажется, отметка «Первый день» больше, чем отметка последнего дня, которая в конечном итоге заканчивает цикл в первый раз.

Поскольку PHP вычисляет разницу во времени в полночь, это решение не работает, когда месяц начинается в этот день. И в некоторых случаях тоже не работает в последний день.

Я рассмотрел эти проблемы в следующем коде. И этот код можно использовать в любой день недели.

Решение было создано с помощью кода Эли в этом вопросе: Получить первую или последнюю пятницу в месяц

 ///// code starts here ///// function getWeekDates($year, $month, $day){ $tsInMonth = strtotime("$year-$month"); $monthNumber = (int)date("m",$tsInMonth); $Names = array( 1=>"Sun", 2=>"Mon", 3=>"Tue", 4=>"Wed", 5=>"Thu", 6=>"Fri", 7=>"Sat" ); $ThisMonthTS = strtotime( date("Ym-01", $tsInMonth ) ); $NextMonthTS = strtotime( date("Ym-01", strtotime("next month", $tsInMonth) ) ); $weekDates = array(); for($Ord=1;$Ord<=5;$Ord++){ $DateOfInterest = (-1 == $Ord) ? strtotime( "last ".$Names[$day], $NextMonthTS ) : strtotime( $Names[$day]." + ".($Ord-1)." weeks", $ThisMonthTS ); ($Ord==5 && (int)date("m",$DateOfInterest)==(int)date("m",$NextMonthTS)) ? false : $weekDates [] = $DateOfInterest; } return $weekDates; } ///// Usage ///// foreach (getWeekDates("2010", "2", "2") as $day) { echo "<br>" . date("l, Ymd", $day); } ///// End of code ///// 

Надеюсь, это поможет кому-то.

Он работает отлично.

 function get_all_days_of_the_month($week_day,$year, $month) { $ts = strtotime("first $week_day 01-$month-$year"); $days = array(); while(date('n',$ts) == $month) { array_push($days,$ts); $ts = strtotime("next $week_day", $ts); } return $days; } 

Я переписал решение @ Gordon на любой день

 function get_dates_of_day($y, $m, $day_name) { return new DatePeriod( new DateTime("first $day_name of $y-$m"), DateInterval::createFromDateString("next $day_name"), new DateTime("next month $y-$m-01") ); } 

Теперь вы можете просто сделать get_dates_of_day('2015','08','wednesday') и использовать то же самое, чтобы получать даты в течение любого дня в данном месяце.

Я написал для этого следующий код … и его работа отлично для меня

 function get_month_date($year, $month, $day) { $monthdays = date('t', mktime(0, 0, 0, $month, 1, $year)); $dates = array(); for($i = 0; $i <= $monthdays; $i++ ) { if($day == date('l', mktime(0, 0, 0, $month, 1+$i, $year)) && $month == date('n', mktime(0, 0, 0, $month, 1+$i, $year))) { $dates[] = date('Ym-d', mktime(0, 0, 0, $month, 1+$i, $year)); } } return $dates; } 

Мы можем использовать его как:

 $days = get_month_date($year, $month, 'Wednesday'); 

Он вернет массив всех дат среды в указанный месяц и год

Вот пример

 function getSundays($y,$m){ $date = "$y-$m-01"; $first_day = date('N',strtotime($date)); $first_day = 7 - $first_day + 1; $last_day = date('t',strtotime($date)); $days = array(); for($i=$first_day; $i<=$last_day; $i=$i+7 ){ $days[] = $i; } return $days; } $days = getSundays(2016,04); print_r($days); 

Попробуйте этот, чтобы получить все среды в текущем месяце.

 $month = date('m'); $year = date('Y'); function getDays($year,$month){ $days = cal_days_in_month(CAL_GREGORIAN, $month,$year); $wed = array(); for($i = 1; $i<= $days; $i++){ $day = date('Ym-'.$i); $result = date("D", strtotime($day)); if($result == "Wed"){ $wed[] = date("Ymd", strtotime($day)). " ".$result."<br>"; } } return $wed; } $wed = getDays($year,$month); print_r($wed); 

Если DateTime не указан, вам нужно знать день для одной даты – например, начало эпохи unix (1 января 1970 г.).

Оттуда вы просто найдете первую среду, а оттуда найдете свой месяц. Имейте в виду високосные годы, и вы хороши.

Очевидно, что это не самый эффективный алгоритм в мире, но он выполнит эту работу.