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

Форум PHP

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

 

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

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

тема: определение дня недели
 
 автор: kazakru   (18.07.2006 в 05:27)   письмо автору
 
 

Доброго времени суток
существует простая функция вычисления 1 дня недели

date("w",mktime(0,0,0,01,1,2006));

но столкнулся с парадоксом...
попробуйте сами поставить август или сентябрь (08 или 09) в 2006 и 2007 ( больше не проверял ) годах
в 2006 выдает что в обоих месяцах 1 день недели это 4 ( четверг ) а в 2007 что типа 5 ( пятница)

что это за глюк и как это исправить?

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

   
 
 автор: Trianon   (18.07.2006 в 10:06)   письмо автору
 
   для: kazakru   (18.07.2006 в 05:27)
 

Потому что и 08 и 09 - это не числа.
В восьмеричной системе счисления нет ни цифры 8, ни цифры 9.

   
 
 автор: kazakru   (18.07.2006 в 10:42)   письмо автору
 
   для: Trianon   (18.07.2006 в 10:06)
 

тоесть если у меня исходные данные представлены напрример в нормальном русском формате 01.08.1983
я не смогу эти данные подставить не удалив снгачала нули?

   
 
 автор: Trianon   (18.07.2006 в 11:12)   письмо автору
 
   для: kazakru   (18.07.2006 в 10:42)
 

Куда и как Вы собираетесь подставлять данные?
Исходные данные обычно представлены в строках, а не в числах.

   
 
 автор: cheops   (18.07.2006 в 12:19)   письмо автору
 
   для: kazakru   (18.07.2006 в 05:27)
 

Дело в том, что компьютеры, языки программирования разрабатываются не в России, а на Западе, а там неделя начинается с воскресенья, а не с понедельника. Кроме того у функции mktime() дебильный синтаксис, в приведённом примере 01 - это месяц, а 1 - это число...

   
 
 автор: kazakru   (18.07.2006 в 12:49)   письмо автору
 
   для: cheops   (18.07.2006 в 12:19)
 

брр совсем вы меня запутали
я делаю небольшой скриптик вывода праздников и событий

когда праздник задан конкретно тоесть например 12.09 то вычислить через сколько он будет и вывести его если это сегодня не составляет труда.
НО есть даты типа последнее воскресение марта ( перевод часов )
в базе эта дата хранится как U5.03
или например второй понедельник августа P2.08

вот из этих данных мне надо получить число дня, вырезать нули из месяца не проблема , как точно узнать какое это будет число.

тоесть вот плиз покажите на примере как из U5.3.2007 получить 25.3.2007

   
 
 автор: cheops   (18.07.2006 в 13:06)   письмо автору
 
   для: kazakru   (18.07.2006 в 12:49)
 

U и P - что означают? И что означает цифра 5 - это код воскресенья или что-то другое?

   
 
 автор: kazakru   (18.07.2006 в 13:11)   письмо автору
 
   для: cheops   (18.07.2006 в 13:06)
 

Это просто условные обозначения дня недели
U - воскресение
P - понедельник
V - вторник
W - среда
C - четверг
F - пятница
S - суббота
а цифра рядом обозначает какой по счету это будет день
тоесть
U1 - первое воскресение
U2 - второе воскресение
U3 - третье воскресение
U4 - четвертое воскресение
цифра 5 обозначает что это самое последнее, тоесть не важно 4 оно будет или 5.
Вот например U5.03 это последнее воскресение марта

   
 
 автор: Trianon   (18.07.2006 в 13:15)   письмо автору
 
   для: kazakru   (18.07.2006 в 12:49)
 

А осенний перевод как обозначен? U5.10 ?
Показали бы значения всех буковок. Для всех дней недели.

to cheops: в U5.03 - пятерка наверное обозначает последний день недели.

   
 
 автор: kazakru   (18.07.2006 в 13:30)   письмо автору
 
   для: Trianon   (18.07.2006 в 13:15)
 

да осенний именно U5.10

или например
P2.10 Начало всемирной недели письма ( второй понедельник октября )

PS
я выше расшифровал все дни

   
 
 автор: Trianon   (18.07.2006 в 14:13)   письмо автору
 
   для: kazakru   (18.07.2006 в 13:30)
 

<?
$str 
'U5.10'//'18.07.2006'  'P2.08.2008'
@list($dd$mm$yyyy)=explode('.'$str);
if(!
$yyyy$yyyy intval(date('Y'));
$mm intval($mm); $yy intval($yyyy);
if(
is_numeric($dd)) $dd intval($dd);
else
{
    
$weekday strpos("UPVWCFS",$dd[0]);
    
$wdnum intval($dd[1]);
    
$monthstart  mktime(12,0,0,$mm1$yyyy);
    
$mswkday date('w'$monthstart);
    
$need = ((($weekday+7-$mswkday)%7)+7*($wdnum-1));
    
$need $monthstart $need *86400;
    if(
$mm != date('n'$need))
        
$need -= 7*86400;
    
$dd intval(date('j',$need));
}
echo 
"$dd.$mm.$yyyy ".date('l'mktime(12,0,0,$mm,$dd,$yyyy));
?>

Правда, этот скрипт не проверяет, прошла ли уже дата в этом году или еще нет.

   
 
 автор: kazakru   (18.07.2006 в 14:43)   письмо автору
 
   для: Trianon   (18.07.2006 в 14:13)
 

вот что значит гуру, пойду пробовать заранее огромное спасибо, а проверка эта не нужна
у меня сделано если сечас например 8 месяц а в искомой дате месяц равно или больше 8 то год посдчталяеться этот, а если меньше то следущий.
счас все это попробую соединить )

   
 
 автор: kazakru   (18.07.2006 в 17:08)   письмо автору
 
   для: kazakru   (18.07.2006 в 14:43)
 

уважаемые гуру, дабы не постить кучу постов, поробую вас попросить сдесь.
можно ли каким то образом уменьшить код?

$den="дней";
if($den2==2)$den="дня";
if($den2==3)$den="дня";
if($den2==4)$den="дня";
if($den2==02)$den="дня";
if($den2==22)$den="дня";
if($den2==32)$den="дня";
if($den2==42)$den="дня";
if($den2==52)$den="дня";
if($den2==62)$den="дня";
if($den2==72)$den="дня";
if($den2==82)$den="дня";
if($den2==92)$den="дня";
if($den2==03)$den="дня";
if($den2==23)$den="дня";
if($den2==33)$den="дня";
if($den2==43)$den="дня";
if($den2==53)$den="дня";
if($den2==63)$den="дня";
if($den2==73)$den="дня";
if($den2==83)$den="дня";
if($den2==93)$den="дня";
if($den2==04)$den="дня";
if($den2==24)$den="дня";
if($den2==34)$den="дня";
if($den2==44)$den="дня";
if($den2==54)$den="дня";
if($den2==64)$den="дня";
if($den2==74)$den="дня";
if($den2==84)$den="дня";
if($den2==94)$den="дня";
if($den2==01)$den="день";
if($den2==21)$den="день";
if($den2==31)$den="день";
if($den2==41)$den="день";
if($den2==51)$den="день";
if($den2==61)$den="день";
if($den2==71)$den="день";
if($den2==81)$den="день";
if($den2==91)$den="день";
if($den2==11)$den="дней";
if($den2==12)$den="дней";
if($den2==13)$den="дней";
if($den2==14)$den="дней";

   
 
 автор: Trianon   (18.07.2006 в 17:35)   письмо автору
 
   для: kazakru   (18.07.2006 в 17:08)
 

<?
function dys($n)
{
  
$m $n %10;   $u $n %100;   $w = array(' дней',' день',' дня' );
  if(
$u >=&& $u <= 20$m=0;  else if($m >= 5$m=0;  else if($m >= 2$m=2;
  return 
$w[$m];
}
for(
$i 0$i 366$i++) echo $i.dys($i).'<br>';
?>

   
 
 автор: kazakru   (18.07.2006 в 18:00)   письмо автору
 
   для: Trianon   (18.07.2006 в 17:35)
 

блин и откуда вы все это знаете? :) СЕНКС ОГРОМНЫЙ

блин пока писал еще одна проблема вылезла
вот например запрос к базе
напомню в базе хранятся даты вида
12.06.2003
14.05
23.03.1070

WHERE data LIKE '%.05%' - он выведет все даты за май месяц

а как можно сделать что бы он выдал даты за период с мая по август ( с 05 по 08 ) и при этом этот параметр нужно задать до запроса, я уж и так и так , а в результате шиш...
хотя пока писал вопрос подумал что этот запрос тоже не идеален, если запрос будет

%.10% то он выведет не только все за 10 месяц но и все даты начинающиеся на 10 типа 1037

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

   
 
 автор: Trianon   (18.07.2006 в 18:06)   письмо автору
 
   для: kazakru   (18.07.2006 в 18:00)
 

с помощью LIKE Вы этого не добьетесь.
тут нужен SELECT .... WHERE SUBSTRING(data, 4, 2) BETWEEN '05' AND '08'

   
 
 автор: kazakru   (18.07.2006 в 18:24)   письмо автору
 
   для: Trianon   (18.07.2006 в 18:06)
 

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

   
Rambler's Top100
вверх

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