Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Навигация по неделям
 
 автор: gurza   (28.10.2009 в 01:01)   письмо автору
 
 

$week = date("W");

количество недель в году будет всегда 52 или может быть разное?
а и можно ли по номеру недели определить ее начало и конец пример:
с 19.10.2009 по 25.10.2009

  Ответить  
 
 автор: gurza   (28.10.2009 в 20:58)   письмо автору
 
   для: gurza   (28.10.2009 в 01:01)
 

?

  Ответить  
 
 автор: Саня   (28.10.2009 в 21:13)   письмо автору
 
   для: gurza   (28.10.2009 в 01:01)
 

Сколько дней может быть в году?

  Ответить  
 
 автор: gurza   (28.10.2009 в 21:20)   письмо автору
 
   для: Саня   (28.10.2009 в 21:13)
 

да сколько дней не важно меня интерисует date("W"); будет всегда 52 просто делаю навигацию по рейтингу по неделям в базу записываю
пример 2009.43
вопрос еще в том можно ли имея год и номер недели получить дату начала недели и конц недели

  Ответить  
 
 автор: Саня   (28.10.2009 в 21:24)   письмо автору
 
   для: gurza   (28.10.2009 в 21:20)
 

> ...можно ли имея год и номер недели получить дату начала недели и конц недели
Можно.

  Ответить  
 
 автор: Саня   (28.10.2009 в 21:31)   письмо автору
 
   для: gurza   (28.10.2009 в 21:20)
 

Сначала вычисляете какое число будет чезез $w недель (начиная с начала года). Затем узнаёте какой это день недели. Если не понедельник, то отнимаете время, чтобы получился понедельник. Это и будет начало недели. Ну а конец будет ровно через 7 дней.
Рекомендую производить вычисления в unix timestamp.

  Ответить  
 
 автор: gurza   (28.10.2009 в 21:33)   письмо автору
 
   для: Саня   (28.10.2009 в 21:31)
 

если не трудно примечик моно

  Ответить  
 
 автор: Саня   (28.10.2009 в 21:36)   письмо автору
 
   для: gurza   (28.10.2009 в 21:33)
 

Сначала сами попробуйте. Это же элементарно. Я дам наводящие советы, если это будет необходимо.
Собственно для всей задачи понядобятся функции mktime(), date() и оператор сложения.

  Ответить  
 
 автор: gurza   (28.10.2009 в 22:02)   письмо автору
 
   для: Саня   (28.10.2009 в 21:36)
 

ок попробую

  Ответить  
 
 автор: Trianon   (28.10.2009 в 22:04)   письмо автору
 
   для: Саня   (28.10.2009 в 21:31)
 

Не надо в unix timestamp.
Человек со временем не работает - зачем такие ограничения...
jd_to_gregorian вполне пойдет.

  Ответить  
 
 автор: Саня   (28.10.2009 в 23:52)   письмо автору
 
   для: Trianon   (28.10.2009 в 22:04)
 

А в чём выгода? Всё равно прийдётся вызывать date() для определения дня недели.

  Ответить  
 
 автор: Trianon   (29.10.2009 в 02:13)   письмо автору
 
   для: Саня   (28.10.2009 в 23:52)
 

Необязательно.
А выгода в том, что спокойно будут обрабатываться даты вроде моего дня рождения.

  Ответить  
 
 автор: Саня   (29.10.2009 в 02:22)   письмо автору
 
   для: Trianon   (29.10.2009 в 02:13)
 

Приведите мне несколько пар год-неделя. Я протестирую свой "штампованый" скрипт.

  Ответить  
 
 автор: Trianon   (29.10.2009 в 02:33)   письмо автору
 
   для: Саня   (29.10.2009 в 02:22)
 

Я имею в виду - даты ранее 1970
На них сбои бывали, как минимум на старых версиях php.
И совершенно очевидно - на сопряженке с MySQL.
Так как MySQL отрицательные таймштампы тупо не берет

  Ответить  
 
 автор: Саня   (29.10.2009 в 07:05)   письмо автору
 
   для: Trianon   (29.10.2009 в 02:33)
 

И что, теперь не пользоваться штампами совсем?

> Так как MySQL отрицательные таймштампы тупо не берет
Для этого есть специальные типы —DATETIME, DATE. Не мне вам об этом говорить...

  Ответить  
 
 автор: gurza   (29.10.2009 в 09:27)   письмо автору
 
   для: Саня   (29.10.2009 в 07:05)
 

чето не срастается при при переходе с 8 января 2009 почемуто дата не 1 января а 31 декабря получается
притом номер дня недели 4 остается а 31 получается 3 день недели



$week = $temp_week * 7 * 86400;
     
   
     $weekDay = date("w",$week);
     $weekDay_ = date("j",$week);
     $weekDay__ = date("F",$week);



может я чето неправильно делаю

  Ответить  
 
 автор: Саня   (29.10.2009 в 09:32)   письмо автору
 
   для: gurza   (29.10.2009 в 09:27)
 

Весь код покажите.

  Ответить  
 
 автор: gurza   (29.10.2009 в 20:23)   письмо автору
 
   для: Саня   (29.10.2009 в 09:32)
 

вот



$temp_year = $_GET["w"] ? substr($_GET["w"], 0, -2) : date("Y");
     $temp_week = $_GET["w"] ? substr($_GET["w"], 4, 2) : date("W");
     
     
     $week = $temp_week * 7 * 86400;
     
   
     $weekDay = date("w",$week);
     
     $temp_week = $temp_week - 1;
     if ($temp_week <= 9){$temp_week = "0".$temp_week."";}
     
      if ($temp_week!=0) 
        { 
             $ac_week_prev = $temp_year.$temp_week; 
        } 
        else 
        { 
             $temp_year = $temp_year - 1;
             $temp_week = $temp_week - 1; 
             $ac_week_prev = "".$temp_year."52"; 
        }
        
     
     $monDay = ($weekDay - 1) * 86400;
     $monDay = $week - $monDay;
     $fDay = date("d",$monDay);
     $fMonth = date("n",$monDay);
     $monthArr = array("none","Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Окрября","Ноября","Декабря");
     $Month = $monthArr[$fMonth];
     
    
     
     $actual = !$_GET["w"] ? "<br /><b>текущая неделя</b> <br /><br />" : "<br /><b> c $fDay $Month</b><br /><br />";

     $HTML.= "$actual <a href=\"chart/".$_GET["chartId"]."/$ac_week_prev\">« предыдущая неделя</a> ";


  Ответить  
 
 автор: gurza   (30.10.2009 в 10:21)   письмо автору
 
   для: gurza   (29.10.2009 в 20:23)
 

во немного переделал

но всеравно при переходе на 2008 год чето нетовместо понедельник 29 первый день идет как 28 число а это воскресение может гдето ошибка в расчете



$temp_year = $_GET["w"] ? substr($_GET["w"], 0, -2) : date("Y");
     $temp_week = substr($_GET["w"], 4, 2);
     
     
     $week = $temp_week * 7 * 86400;
     
      if ($temp_week!="01") 
        { 
             $temp_week = $temp_week - 1;
             if ($temp_week <= 9){$temp_week = "0".$temp_week."";}
             $ac_week_prev = $temp_year.$temp_week; 
        } 
        else 
        { 
             $temp_year = $temp_year - 1;
             $temp_week = $temp_week - 1; 
             $ac_week_prev = "".$temp_year."52"; 
        }
        
     $monthArr = array("none","Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Окрября","Ноября","Декабря");
   
     $weekDay = date('w', $week);
     $prev = (14+$weekDay-1) %7;
     
     
     $fDay = date("d",$week - 86400*$prev);
     
     $fMonth = date("n",$week - 86400*$prev);
     $valid_date = mktime(0, 0, 0,$fMonth,$fDay,$temp_year);
     $sun = (7 * 86400) +$valid_date;
     $sDay = date("d",$sun);
     
     $sMonth = date("n",$sun);
     
     $Month = $monthArr[$fMonth];
     $Month_ = $monthArr[$sMonth];
    
     
    if (substr($_GET["w"], 4, 2) != date("W")){ $actual = "".substr($_GET["w"], 4, 2)."<br /><br /><b> c $fDay $Month $temp_year по $sDay $Month_ ".date("Y",$sun)."</b><br /><br />";}else{ $actual = "<br /><b>текущая неделя</b> <br /><br />"; }

     $HTML.= "$actual <a href=\"chart/".$_GET["chartId"]."/$ac_week_prev\">« предыдущая неделя</a> ";


  Ответить  
 
 автор: Саня   (30.10.2009 в 13:55)   письмо автору
 
   для: gurza   (30.10.2009 в 10:21)
 

date('w') возвращает 0 для воскресенья, 1 для понедельника и далее.

  Ответить  
 
 автор: gurza   (30.10.2009 в 14:26)   письмо автору
 
   для: Саня   (30.10.2009 в 13:55)
 

это понятно ну а что не правильно я делаю все идет нормально пока не переходит на другой год

  Ответить  
 
 автор: gurza   (30.10.2009 в 20:03)   письмо автору
 
   для: gurza   (30.10.2009 в 14:26)
 

кажись все понял

  Ответить  
 
 автор: gurza   (30.10.2009 в 20:25)   письмо автору
 
   для: gurza   (30.10.2009 в 20:03)
 

все разобрался вот че получилось


<?

 $temp_week 
52;
     
     
$temp_year 2009;
     
     
     
$week $temp_week 86400;
     
     
$beg_week_td mktime(000date("m"$week), date("d"$week), $temp_year); 
     
$today getdate($beg_week_td); 
     
     
$prev = (14+$today['wday']-1) %7;
     
     
$monthArr = array("none","Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Окрября","Ноября","Декабря");
   
     
     
$fDay date("d",$beg_week_td 86400*$prev);
     
$fMonth date("n",$beg_week_td 86400*$prev);
     
$fYear date("Y",$beg_week_td 86400*$prev);
     
     
     
$sun $beg_week_td 86400*$prev 86400 6;
     
$sDay date("d",$sun);
     
$sMonth date("n",$sun);
     
$sYear date("Y",$sun);
     
     echo 
"c ".$fDay." ".$monthArr[$fMonth].$fYear по ".$sDay." ".$monthArr[$sMonth].$sYear<br />";


?>


  Ответить  
 
 автор: gurza   (30.10.2009 в 21:17)   письмо автору
 
   для: gurza   (30.10.2009 в 20:25)
 

а вот сразу не заметил почему первая неделя 2009 у меня получается с 5 по 11 января а надо тоб было с 29 декабря 2008 по 4 января 2009

  Ответить  
 
 автор: gurza   (31.10.2009 в 13:32)   письмо автору
 
   для: gurza   (30.10.2009 в 21:17)
 

мне кажется что неправильно высчитывает неделю

$week = $temp_week * (24*60*60*7);

  Ответить  
 
 автор: gurza   (02.11.2009 в 13:26)   письмо автору
 
   для: gurza   (31.10.2009 в 13:32)
 

ни каких идей у меня получается что счас не 45 неделя а 46
c 09 Ноября 2009 по 15 Ноября 2009



$week = $temp_week * (24*60*60*7);

  Ответить  
 
 автор: Саня   (02.11.2009 в 14:11)   письмо автору
 
   для: gurza   (02.11.2009 в 13:26)
 

$week = ($temp_week - 1) * 7 * 86400;

  Ответить  
 
 автор: gurza   (02.11.2009 в 14:36)   письмо автору
 
   для: Саня   (02.11.2009 в 14:11)
 

я так уже пробывал дело в том что тогда при переходе на 2010 год 53 неделя
c 28 Декабря 2009 по 03 Января 2010
и она же получается первой неделей 2010 т.е на неделю меньше все становится

  Ответить  
 
 автор: Саня   (02.11.2009 в 16:04)   письмо автору
 
   для: gurza   (02.11.2009 в 14:36)
 

Откуда у вас взялась 53 неделя?

  Ответить  
 
 автор: gurza   (02.11.2009 в 16:12)   письмо автору
 
   для: Саня   (02.11.2009 в 16:04)
 

смотрю в мобилке а что есть отличие

  Ответить  
 
 автор: Саня   (02.11.2009 в 23:00)   письмо автору
 
   для: gurza   (28.10.2009 в 01:01)
 

Я встречал три типа календарей:
1. Первой считается неделя, в которой присутствует 1 января.
2. Первой неделей считается неделя, следующая за неделей в которой присутствует 31 декабря.
3. Если 1 января выпадает на пятницу-воскресенье, то первая неделя считается как в п. 2. Иначе как в п. 1.

В мобильниках 3 вариант. Собственно проблема решается отловом дня недели первого января искомого года. И если пт-вс, то прибавить дней до понедельника. Соответственно на пн-чт отнимается время.

  Ответить  
 
 автор: gurza   (03.11.2009 в 21:56)   письмо автору
 
   для: Саня   (02.11.2009 в 23:00)
 

date("W") всегда даст в году 52 недели?

  Ответить  
 
 автор: Саня   (03.11.2009 в 22:48)   письмо автору
 
   для: gurza   (03.11.2009 в 21:56)
 

Проверьте. А потом скажете мне.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования