Делаю календарик новостей, есть небольшой вопрос (не по датам)

ego|brain

Guest
Автор оригинала: Spear
ego|brain
ой.. да я уже и сам незнаю *бьет себя в лоб. хохочет*
просто очень долго объяснть :( я уже еле-еле до клавы дотягиваюсь (ужи диван пододвинул.. лежу на диване и ищу в нете ответ на вопрос ))
плохо ищешь сталобыть.

PHP:
echo date('W', mktime(0,0,0,$month,1,$year));
рабочий вариант. дату пропарсить сможешь? :D
возвращает номер недели в году. Мануалы читать надо внимательнее. Там чаще всего есть ответы на все твои вопросы ;)
 

Spear

почемучка
ego|brain
:) не то.. это я тоже сделать могу ;) Конечно, спасибо за ответ. но проблема вот в чем:

есть, грубо говоря
$year = 2005
$month = 06
$w= 1 - это не номер недели в году, это номер недели в МЕСЯЦЕ.

вот из этих данных и нужно найти номер недели в году :(:(

-~{}~ 20.06.05 05:59:

блин... никак не могу придумать..
вообщем - посплю.. блин ненавижу ложиться спать когда что-то не сделано :(
 

ego|brain

Guest
в чем проблема тогда?.
PHP:
echo date('W', mktime(0,0,0,$month,1,$year));
возвращает по месяцу и году номер недели первого дня месяца.

приплюсуй номер недели в месяце.

PHP:
$month = '6';
$year = '2005';

$w = 2;//скажем вторая неделя
$tw =  date('W', mktime(0,0,0,$month,1,$year));
$tw .= $w;

////////
пардон..
PHP:
$tw = $tw + $w;
 

Spear

почемучка
ego|brain
спасибо! Сейчас убегаю на экзамен, потом прийду проверю.
Только нужно будет сначала сделать:
$w=$w-1;
потому что чтобьы не прибавлялся номер первой недели в конему первой недели ;) по идее

-~{}~ 20.06.05 20:52:

ох я немогу с этими неделями никак разобраться :(

подскажите, пожалуйста,
как узнать дату первого дня в 25ой неделе? Сам немогу... уже более суток с этим календарем мучаюсь :(
 

SiMM

Новичок
Если неделя начинается с воскресенья:
PHP:
$t = mktime(12,0,0,1,1,date('Y'));
echo date('d-m-Y',$t+(25*7-date('w',$t))*24*60*60);
Если неделя начинается не с воскресенья (а также иные особые случаи) изучай и обрабатывай сам.
http://detail.phpclub.ru/article/date_stuff
[m]datetime[/m]
 

Spear

почемучка
SiMM
Спасибо за помощь!

Если я правильно понимаю, то код ниже выведит первое число 25ой недели, начиная с понедельника? Вроде работает.. опять-таки - интересно правильно ли сделал? $t = mktime(-1,0,0,1,1,date('Y'));
echo date('d-m-Y',$t+(25*7-date('w',$t))*24*60*60);

-~{}~ 20.06.05 23:18:

Ох блин, немогу. Уже голова пухнет от этих гребаных дат :(

Опять запутался.. все вроде правильно... и по мануалу и по докам.. блин :(

:
$yearx и $monthx - берутся из другой переменной. Например они равні 2005 и 06 соответственно.

PHP:
 $w = $_GET['w']; // номер недели в месяце. От 1 до 5ти.

        $tw =  date('W', mktime(0,0,0,$monthx,1,$yearx));
        $w = $w - 1;
        $tw = $tw + $w; // номер недели в году.

        $t = mktime(12,0,0,1,1,$yearx);
echo date('d-m-Y',$t+($tw*7-date('w',$t))*24*60*60); // по идее должны увидеть дату первого дня в этой недели.. а получается неправильная дата, типо середины недели, иногда субботы, иногда четверга.. это я уже пытаюсь с mktime поиграть..
подскажите. пожалуйста. - где ошибка? Почему не работает код так как должен? :( ёпрст...
 

Фанат

oncle terrible
Команда форума
я давно потерял нить обсуждения.
Spear, не можешь пояснить - а что тебе надо-то?
какую задачу решаешь?
 

Spear

почемучка
Фанат
привет.
Такая задача:

есть число 06-2005 (месяц-год. без дня)
и есть переменная $w обозначающая номер недели в этом месяце. Например $w = 1 (первая неделя июня 2005-ого года).

нужно узнать дату первого дня на этой неделе.
Для начала узнаю номер недели в году:
PHP:
$w = $_GET['w']; //номер недели в месяце.

        $tw =  date('W', mktime(0,0,0,$monthx,1,$yearx)); // узнаю номер первой недели в году этого месяца. переменные $monthx и $yearx берутся из другой переменной. в этом коде я её не выводил. но даты правильные, ошибки тут нет.

        $w = $w - 1; // отнимаю единицу от номера. Это нужно на след строке чтобы правильно работало.

        $tw = $tw + $w; // номер недели $w в текущем году
а дальше, имея номер недели, например єто 22-ая неделя,
нужно узнатьдату понедельника и воскресенья.. ну мне бы понедельник узнать, там уже 6ть дней я прибалю :)

Все незнаю где я ошибаюсь.. может где-то из-за невнимательности что-то упустил?
 

SiMM

Новичок
> как узнать дату первого дня в 25ой неделе?
> нужно узнать дату первого дня на этой неделе.
Ты уж определился бы уже...
 

mani13

Новичок
по поводу первого дня на этой неделе, алгоритм:
1. узнаём каким днём недели является 1 число нужного месяца
[2.] если неделя начинается не с воскресенья, то двигаем номер дня недели из п.1 так, чтобы номер первого дня недели был равен 0, а последнего - 6
3. сдвигаем дату до начала недели(timestamp 1 числа - п.2*24*60*60)
4. имея дату начала первой недели месяца, получаем дату начала нужной недели...

p.s.: 4 строчки и 2 функции - date и mktime :)
 

Spear

почемучка
mani13
для программера со стажем - не спорю, можно и в 4 строчки вписать ;) также как и для сноубордиста с опытом закрутить 360+grab ;)
Но вот не судьба - я не програмер со стажем, а кто0-то может не сноубордист.. в итоге - без помощи не обойтись )

-~{}~ 21.06.05 00:10:

mani13
блин третий пункт непойму что делать :(

вот первые два (из календаря Фаната):

$month_stamp=mktime(0,0,0,$monthx,1,$yearx);
$weekday=date("w",$month_stamp);
if ($weekday==0) $weekday=7;

правильно? а что дальше? Подскажите, пожалуйста.
 

mani13

Новичок
Spear, лови:
PHP:
<?php
 $week  = 1; // Номер нужной недели
 $month = 05; // Данный месяца
 $year  = 2005; // Данный год
 $start = 1; // Начало недели в обозначениях: 0-воскресенье, 6-суббота
 
 $time = mktime(0, 0, 0, $month, 1, $year);// Timestamp 1 дня месяца
 $day = date('w', $time);// Номер дня в неделе 1 числа
 $day = ($day-$start<0)? $day-$start+7: $day-$start; // Двигаем начало недели
 $time += (($week-1)*7-$day)*24*60*60; // Timestamp начала недели
?>
вроде так, если интересует начало недели(то есть начало 1недели июня - 30мая)
p.s.: Фанат, в календаре подправь 1970 год на 1902 вроде, так как на unix всё отлично работает и с отрицательный timestamp :)
точнее, даже универсальнее так: mktime от предложенного, а сравнивать полученный год в mktime и первоначальный :)
 

Spear

почемучка
mani13
Спасибо!! Работает отлично ;)

последний вопрос. с которым я был уверен что справлюсь:
как узнать дату последнего дня недели?
вот код ниже - не работает.. точнее - правильно выводит число последнего дня недели, но всегда - январь 1970 ого ))
PHP:
$week  = $w; // &#205;&#238;&#236;&#229;&#240; &#237;&#243;&#230;&#237;&#238;&#233; &#237;&#229;&#228;&#229;&#235;&#232;
$start = 1; // &#205;&#224;&#247;&#224;&#235;&#238; &#237;&#229;&#228;&#229;&#235;&#232; &#226; &#238;&#225;&#238;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255;&#245;: 0-&#226;&#238;&#241;&#234;&#240;&#229;&#241;&#229;&#237;&#252;&#229;, 6-&#241;&#243;&#225;&#225;&#238;&#242;&#224;

$time = mktime(0, 0, 0, $monthx, 1, $yearx);// Timestamp 1 &#228;&#237;&#255; &#236;&#229;&#241;&#255;&#246;&#224;
$day = date('w', $time);// &#205;&#238;&#236;&#229;&#240; &#228;&#237;&#255; &#226; &#237;&#229;&#228;&#229;&#235;&#229; 1 &#247;&#232;&#241;&#235;&#224;
$day = ($day-$start<0)? $day-$start+7: $day-$start; // &#196;&#226;&#232;&#227;&#224;&#229;&#236; &#237;&#224;&#247;&#224;&#235;&#238; &#237;&#229;&#228;&#229;&#235;&#232;
$time += (($week-1)*7-$day)*24*60*60; // Timestamp &#237;&#224;&#247;&#224;&#235;&#224; &#237;&#229;&#228;&#229;&#235;&#232;
$time2 += (($week-1)*7-$day+6)*24*60*60; // Timestamp &#237;&#224;&#247;&#224;&#235;&#224; &#237;&#229;&#228;&#229;&#235;&#232;
echo date('d-m-Y', $time);
echo "<br>";
echo date('d-m-Y', $time2);
(за кодировку сори - это глючит Winsyntax)

-~{}~ 21.06.05 00:36:

первый echo - работает. Дата первого дня недели. Второй - не работает.
ё :(
 

Spear

почемучка
ой я в мануалах уже больше суток копаюсь :( не издевайтесь, пожалуйста ;)
 

Фанат

oncle terrible
Команда форума
Spear
скажи, я правильно понимаю, что имея таймстамп первого дня недели, ты не можешь узнать дату последнего?
 

Spear

почемучка
Фанат
:D:D:D блин вот что значит "засиделся" блин! (я про себя. конечно) ;)
Точно. Дата послежднего - это date("d-m-Y", (таймстемп первого + 518400));
518400 - 6 дней в секундах :) УРЯ!
Всем большое спасибо! Особенно mani13,
SiMM и
Фанату!
 

Фанат

oncle terrible
Команда форума
иногда этот код будет выдавать ошибку.
в марте и в октябре.
 
Сверху