2012-01-27 2 views
4

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

У меня есть 2 combobox - month и year, мне нужна функция, которая приносит мне номер недели из месяца и года, которые я выбрал.

пример:

я выбрать дату 02/2012 (м/год), и комбо принесет недели, что принадлежит к месяцу, что я выбираю. (недель с года).

недели:

5, 6, 7, 8, 9


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

$week_number = 40; 
$year  = 2012; 

if($week_number < 10){ 
    $week_number = "0".$week_number; 
} 

for($day=1; $day<=7; $day++) 
{ 
    echo date('m/d/Y', strtotime($year."W".$week_number.$day))."<br/>"; 
} 

не знаю, могу ли я сделать свое ясное, но, любой вопрос моего гостя.

Спасибо.


резюме:

52 недели в

если я выбрать месяц 2 года, то функция должна возвращать 5, 6, 7, 8, 9.

+0

Просто чтобы прояснить ... Не стоит недели за февраль 2012 года будет {5, 6, 7, 8, 9}? – Hardryv

+0

проклятье, попробуем еще раз: пройдя месяц и год, как я могу получить номер недели с этого месяца? –

+0

@ Хардрюв, номер недели, который я поставил, был просто примером. –

ответ

12

Я думаю, вы должны уметь работать с этим?

$month = "2"; 
$year = "2012"; 

$beg = (int) date('W', strtotime("first thursday of $year-$month")); 
$end = (int) date('W', strtotime("last thursday of $year-$month")); 

print(join(', ', range($beg, $end))); 

ВЫВОД

5, 6, 7, 8 

Примечание

Этот код был неисправен, и произвел неверные результаты, пока не было зафиксировано на 27-Aug-2014.

Период времени, в течение которого принадлежит неделям, определяется тем местом, где наиболее (четыре или более) его дней. Это наиболее просто определяется путем проверки, где падает четверг. Итак, первая и последняя недели месяца - это первые и последние четверги.

+0

что-то вроде этого, но мне нужны все дни с недели, а не только начало и конец. –

+0

Если вы не можете попасть туда от того, что я вам дал, тогда у вас есть * реальные * проблемы! Я изменил свой ответ, чтобы создать массив. – Borodin

+0

+1. Лично я думаю, что '(int) ' более явный и читаемый, чем '0 + '. – FtDRbwLXw6

2

Сначала отметьте отметку времени для 1-го числа месяца/года. И исходя из этого, получите номер недели в первый день.

Как это:

$year = "2012"; 
$mon = "02"; 

$tm = strtotime("$year-$mon-01"); # Substitue year and month 
$first_week_num = date("W", $tm); # Got the week number 

А затем сделать то же самое в последний день месяца.Для этого вы можете просто добавить 1 к месяцу (вам нужно сделать логику, если в месяце 12, где вам нужно добавить 1 к году). А затем вычесть 86400 (количество секунд в день). Таким образом, вы получите последний день месяца и не потрудитесь узнать, сколько дней в этом месяце.

if($mon == 12) 
    $year++; 
else 
    $mon++; 
$tm = strtotime("$year-$mon-01") - 86400; 
$last_week_num = date("W", $tm); 

И все недели с первой недели до последней недели, что вам нужно:

for($i=$first_week_num; $i <= $last_week_num; $i++) 
    print $i; 
+0

Такой длинный способ сделать 'strtotime (« последний день $ year- $ mon »)' – Borodin

+0

@Borodin: Согласен :-) Не понимал, что такие выразительные строки приемлемы для strtotime! Благодаря! – rsmoorthy

+1

Всевозможные приятные вещи в [Относительные форматы дат] (http://uk.php.net/manual/en/datetime.formats.relative.php)! – Borodin

Смежные вопросы