Предположим, сегодня 21 февраля 2011 года (понедельник). Это третий понедельник этого месяца. Если дата указана в качестве входных данных, как я могу узнать, сколько понедельников прошло?
На PHP, как узнать, сколько месяцев прошло в этом месяце uptil сегодня?
$now=time() + 86400; if (($dow = date('w', $now)) == 0) $dow = 7; $begin = $now - (86400 * ($dow-1)); echo "Mondays: ".ceil(date('d', $begin) / 7)."<br/>";
работает на меня….
EDIT: включает и сегодняшний понедельник
Это похоже на довольно простой расчет деления. С текущей даты вычтите количество дней прошлых месяцев (пример: среда = -2), разделите ее на 7 и ceil()
чтобы округлить ее.
EDIT: Это будет включать текущий понедельник в номере, возвращая «3» в понедельник 21-го.
<?php function mondays_get($month, $stop_if_today = true) { $timestamp_now = time(); for($a = 1; $a < 32; $a++) { $day = strlen($a) == 1 ? "0".$a : $a; $timestamp = strtotime($month . "-$day"); $day_code = date("w", $timestamp); if($timestamp > $timestamp_now) break; if($day_code == 1) @$mondays++; } return $mondays; } echo mondays_get('2011-02');
Надеюсь, это вам полезно! Я только что свернул его.
«Остерегайтесь ошибок в приведенном выше коде, я только доказал это правильно, не пробовал».
Работает OK afaik
Вы можете прокручивать все дни до наших дней и рассчитывать на понедельники:
$firstDate = mktime(0, 0, 0, date("n"), 1, date("Y")); $now = time(); $mondays = 0; for ($i = $firstDate; $i < $now; $i = $i + 24*3600) { if (date("D", $i) == "Mon") $mondays ++; }
Не проверял этот скрипт
Попробуй это…
//find the most recent monday (doesn't find today if today is Monday though) $startDate = strtotime( 'last monday' ); //if 'last monday' was not this month, 0 mondays. //if 'last monday' was this month, count the weeks $mondays = date( 'm', $startDate ) != date( 'm' ) ? 0 : floor( date( 'd', $startDate ) / 7 ); //increment the count if today is a monday (since strtotime didn't find it) if ( date( 'w' ) == 1 ) $mondays++;
Другой способ – найти, какой день недели сегодня, найти первый такой день месяца через магический strtotime()
, а затем рассчитать разницу между этим и теперь в неделях. См. Ниже функцию, которая будет принимать Ymd
отформатированной date()
и вернуть тот день недели месяца.
Примечание: strtotime
должен быть подробным, включая «из» и месяц: «первый понедельник 2011-02», иначе он продвинется в один прекрасный день . Это немного меня, когда я тестировал крайние случаи.
Также добавлен некоторый перца дисплея, который является полностью необязательным, но мне это нравилось.
function nthWeekdayOfMonth($day) { $dayTS = strtotime($day) ; $dayOfWeekToday = date('l', $dayTS) ; $firstOfMonth = date('Y-m', $dayTS) . "-01" ; $firstOfMonthTS = strtotime($firstOfMonth) ; $firstWhat = date('Ym-d', strtotime("first $dayOfWeekToday of $monthYear", $firstOfMonthTS)) ; $firstWhatTS = strtotime($firstWhat) ; $diffTS = $dayTS - $firstWhatTS ; $diffWeeks = $diffTS / (86400 * 7); $nthWeekdayOfMonth = $diffWeeks + 1; return $nthWeekdayOfMonth ; } $day = date('Ym-d') ; $nthWeekdayOfMonth = nthWeekdayOfMonth($day) ; switch ($nthWeekdayOfMonth) { case 1: $inflector = "st" ; break ; case 2: $inflector = "nd" ; break ; case 3: $inflector = "rd" ; break ; default: $inflector = "th" ; } $dayTS = strtotime($day) ; $monthName = date('F', $dayTS) ; $dayOfWeekToday = date('l', $dayTS) ; echo "Today is the {$nthWeekdayOfMonth}$inflector $dayOfWeekToday in $monthName" ;