kisa_i_osya ([info]kisa_i_osya) wrote in [info]ru_php,
@ 2008-05-17 18:27:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Вопрос: дан номер недели, выяснить даты "понедельника" и "воскресенья" этой недели
Вопрос: дан номер недели, выяснить даты "понедельника" и "воскресенья" этой недели. Колдунство с date() и strtotime()  подсказывает, что решение где-то рядом. Но туплю уже дня три 8(



(Post a new comment)

(Reply from suspended user)

[info]e_will
2008-05-17 02:40 pm UTC (link)
бред. это только если год с понедельника начинается

(Reply to this) (Parent)(Thread)

Во-во, я сначала тоже так сделал ;-)
[info]kisa_i_osya
2008-05-17 02:58 pm UTC (link)
Во-во, я сначала тоже так сделал ;-)

(Reply to this) (Parent)

(Reply from suspended user)

[info]infernal_knight
2008-05-17 02:57 pm UTC (link)
getdate(time()); возвращает массив с инфой по сегодняшней дате.
wday - номер дня от 0 до 6
mday - день в месяце от 1 до 31
Дальше надеюсь объяснять не надо? =)

(Reply to this) (Thread)

О! Синкопа! ;-)
[info]kisa_i_osya
2008-05-17 02:58 pm UTC (link)
Пробую, тханкс 8)

(Reply to this) (Parent)


[info]alkaruno
2008-05-17 03:00 pm UTC (link)
$year = 2008;
$week = 30;

$fday = mktime(0, 0, 0, 1, 1, $year);

$w = date('w', $fday);
$w = $w == 0 ? 7 : $w;

echo date('r', $fday + 86400 * (7 * ($week - 1) - $w + 1));
echo date('r', $fday + 86400 * (7 * ($week - 1) - $w + 7));

(Reply to this) (Thread)


[info]kisa_i_osya
2008-05-17 03:11 pm UTC (link)
А високосные года?..

86400 как раз и смущает.

P. S. Лядские шумеры, не могли ровно прдумать календарь ;-)

(Reply to this) (Parent)(Thread)


[info]alkaruno
2008-05-17 03:21 pm UTC (link)
в данном случае разницы високосный или нет - никакой...

(Reply to this) (Parent)


[info]ezdakimak
2008-05-17 09:17 pm UTC (link)
Это так вселенная придумала, что оборачивается за 365.25 дней :) Не предлагаешь же ты новый год переносить на 6 утра, полдень (12), 18 часов? :)

(Reply to this) (Parent)(Thread)


[info]ezdakimak
2008-05-17 09:17 pm UTC (link)
В смысле земля за этот срок оборачивается.

(Reply to this) (Parent)(Thread)


[info]pcmag_stuff
2008-05-18 12:55 pm UTC (link)
Ну, этот оборот нам вроде как ясен только по вмене сезонов, а это -- месяц, если не два. Вполне можно было десять месяцев по десять дней, плюс какой-нить единообразный поправочный период ;-)

(Reply to this) (Parent)


[info]stopud
2008-05-18 11:11 am UTC (link)
86400 это число секунд в сутках.

Смущает в том плане, что изменят число минут в часе или дней в неделе, и придётся переписывать код?

(Reply to this) (Parent)

В общем, пока все ж...
[info]kisa_i_osya
2008-05-17 03:14 pm UTC (link)
В общем, пока все ж самым разумным выглядит схема: берем дату, смотрим какой это день недели, далее исходя из нее смотрим сколько добавить/отнять до воскресенья/понедельника, по полученному берем даты и... Несистемненько, но избавляет от всех гемморов с календарем (точнее, перекладывает их на плечи PHP, естстна).

(Reply to this)


[info]e_will
2008-05-17 03:24 pm UTC (link)
for ($i=0;$i<40;$i++){
$fday = gmmktime(0, 0, 0, 1, 7*$i, 2008);
echo strftime("%d
", $fday);
}

результат - печатает число понедельника каждой недели. дальше доделаешь сам :)

(Reply to this)


[info]fpaint
2008-05-17 03:41 pm UTC (link)
$wday=date('w');
$monday=strtotime(($wday?($wday-1):6)." days ago");

(Reply to this) (Thread)

Единственный разумный человек ;-)
[info]sstrukster
2008-05-17 10:22 pm UTC (link)
Единственный разумный человек ;-)

(Reply to this) (Parent)(Thread)

Re: Единственный разумный человек ;-)
[info]fpaint
2008-05-18 04:35 am UTC (link)
Да я задание не внимательно прочитал. Там надо другое. )

(Reply to this) (Parent)


[info]dkrig
2008-05-17 04:08 pm UTC (link)
Для любых операций с датами в похапэ достаточно знать о сущестовании только двух функций:
http://php.net/date
http://php.net/strtotim

(Reply to this) (Thread)


[info]_1313
2008-05-17 06:57 pm UTC (link)


(Reply to this) (Parent)(Thread)


[info]dkrig
2008-05-18 11:31 am UTC (link)
Exactly! =)

(Reply to this) (Parent)


[info]phorror
2008-05-19 06:09 am UTC (link)
strtotime - костыль
mktime - инструмент настоящего джедая!

(Reply to this) (Parent)


[info]andrewus
2008-05-17 05:39 pm UTC (link)
public function GetWeek($tmstamp)
{ //Функция выдает массив из семи дней недели, начиная с $tmstamp.
$g = 0;
$week[$g]['day'] = date('j', $tmstamp);
$week[$g]['weekday'] = date('w', $tmstamp);
$week[$g]['month'] = date('n', $tmstamp);
$week[$g]['year'] = date('Y', $tmstamp);
$monthlimit = date('t', $tmstamp);
$year_was_changed = 0;
$month_was_changed = 0;
for($g = 1; $g < 7; $g++)
{
if($week[$g-1]['day'] == $monthlimit)
{
if($week[$g-1]['month'] == 12)
{
$week[$g]['day'] = 1;
$week[$g]['month'] = 1;
if($week[$g-1]['weekday'] == 6) $week[$g]['weekday'] = 0;
else $week[$g]['weekday'] = $week[$g-1]['weekday']+1;
$week[$g]['year'] = $week[$g-1]['year']+1;
$month_was_changed = 1;
$year_was_changed = 1;
}
else
{
$week[$g]['day'] = 1;
$week[$g]['month'] = $week[$g-1]['month']+1;
$week[$g]['year'] = $week[$g-1]['year'];
if($week[$g-1]['weekday'] == 6) $week[$g]['weekday'] = 0;
else $week[$g]['weekday'] = $week[$g-1]['weekday']+1;
$week[$g]['year'] = $week[$g-1]['year'];
$month_was_changed = 1;
}
}
else
{
$week[$g]['day'] = $week[$g-1]['day']+1;
if($week[$g-1]['weekday'] == 6) $week[$g]['weekday'] = 0;
else $week[$g]['weekday'] = $week[$g-1]['weekday']+1;
$week[$g]['month'] = $week[$g-1]['month'];
$week[$g]['year'] = $week[$g-1]['year'];
}
}
$week['month_was_changed'] = $month_was_changed;
$week['year_was_changed'] = $year_was_changed;
return $week;
}

(Reply to this) (Thread)


[info]deniamnet
2008-05-17 10:22 pm UTC (link)
жесть

(Reply to this) (Parent)


[info]lazy_sergeant
2008-05-18 12:35 am UTC (link)
Можно ещё сделать инпут или селект, где пользователь будет указывать нужное значение.

(Reply to this) (Parent)(Thread)


[info]andrewus
2008-05-18 11:03 am UTC (link)
Собственно, эта функция у меня так и работает. Входной параметр не зря же сделан:)

(Reply to this) (Parent)


[info]stopud
2008-05-18 11:08 am UTC (link)
$start = strtotime("1 January 2008");
$start_day = date("N",$start);

$days_to_monday = ($номер_недели)*7 - ($start_day - 1);

$date_monday = date("r", $start + 86400*$days_to_monday);
$date_sundat = date("r", $start + 86400*($days_to_monday+6));

как то так

(Reply to this)


Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…