Forum Webscript.Ru
Программирование => PHP => Тема начата: Alan от 02 Сентября 2003, 19:23:23
-
Люди,помогите написать скрипт. Очень срочно нада... сам пробовал... что-то не то ...
что должен делать:
нужно выводить дату каждой третьей пятницы ближайших четырёх месяцев и сколько до неё осталось дней. примерно так:
Сентябрь :19.09.03 ( 24) Октябрь: 17.10.03 (54) Ноябрь : 21.11.03 (84) Декабрь : 19.12.03 (114)
Буду очень благодарен. Одна надежда на вас....
-
выведет третью пятницу девятого месяца, с другими, думаю, разберешься, дни посчитаешь, несложно будет.
А вообще я это не писал, просто иногда надо заглядывать в мануал и читать раздел Date and Time functions.
До нас уже давно все написано.
echo nthDayOfMonth(3,5,9,2003);
/* dayofweek() will return the day of the week a given date falls. 0=Sunday, 1=Monday, etc. */
function dayofweek($day,$month,$year) {
/* Check date for validity */
if (!checkdate($month,$day,$year))
return -1;
$a=(int)((14-$month) / 12);
$y=$year-$a;
$m=$month + (12*$a) - 2;
$retval=($day + $y + (int)($y/4) - (int)($y/100) + (int)($y/400) + (int)((31*$m)/12)) % 7;
return $retval;
}
/* phpdow_mod is a mod function that deals with negative numbers properly, used by the nthDayOfMonth function below. */
function phpdow_mod($a,$b) {
if ($a <= 0)
return (int)phpdow_mod($b-abs($a),$b);
else
return (int)($a%$b);
}
/*
* nthDayOfMonth($n,$dow,$month,$year) will compute the Nth day of the given
* month. For example, the first Monday in April 2001.
*
* Parameters:
* $n - the Nth day you want, i.e. 2 for 2nd
* $dow - The day of week you want, 0=Sunday, 1=Monday, etc. [0-6]
* $month - The month you want [1-12]
* $year - The full year [like 2001]
*
* Returns:
* The date, in the month you passed, that fits the criteria.
* or..
* -1 = invalid date
* -2 = There is no Nth day of that month, like no 5th Tuesday
* of the specified month
*/
function nthDayOfMonth($n,$dow,$month,$year) {
/* Check the date */
if ($month > 12)
return -1;
if ($dow > 6)
return -1;
/* Valid Nth day, should be no more than 5 */
if (($n <= 0) || ($n > 5))
return -1;
$retval = (7*$n)-6+phpdow_mod($dow-dayofweek(1,$month,$year),7);
/* Sanity check */
if (!checkdate($month,$retval,$year))
return -2;
return $retval;
}
?>
-
только не забудь, что
Воскресенье - 0
Понедельник - 1...
-
ну и кривизна...
о существовании функции mktimr ни автор скрипта, ни доброхот, который его запостил, видимо, не догадываются...
-
RomikChef:
mktimr
Да Ромик!(http://www.alliance.com.ua/smiles/smiles/261.gif)(http://www.alliance.com.ua/smiles/smiles/261.gif)(http://www.alliance.com.ua/smiles/smiles/261.gif) о функции mktimr мы вообще ничего не слышали!
Слушай, а почему ты мануал сам не пишешь(http://www.alliance.com.ua/smiles/smiles/226.gif)
Alan
function third_saturday($month, $year)
{
$stamp = mktime (0, 0, 0, $month, 1, $year);
$third_saturday = mktime(0,0,0,9,(15+(6-date("w", $stamp))),$year);
$saturday = date("d", $third_saturday);
return $saturday;
}
echo third_saturday(10,2003);
?>[OFF]Благодаря Ромику, Юкко пробует стать на путь истинный, но он безнадежен, ничего у него не получится!!! как и у автора, того скрипта, который я привел вначале, теперь мы оба безнадежны![/OFF]
-
чтобы не быть голословным
function third_friday($m,$y) {
$first_weekday=date("w",mktime(0,0,0,$m,1,$y));
if ($first_weekday==0) $first_weekday=7;
if ($first_weekday>5) $add=3*7; else $add=2*7;
$day=6+$add-$first_weekday;
return mktime(0,0,0,$m,$day,$y);
}
for ($i=0;$i<4;$i++) {
$m=date("n");
$y=date("Y");
$friday=third_friday($m+$i,$y);
echo date("d.m.y",$friday),"(".ceil(($friday-time())/(60*60*24)).")
\\n";
}
только тут нету проверки на то, что пятница уже прошла
-
а кто сказал, что я не пишу? ;-)
-
RomikChef:
а кто сказал, что я не пишу? ;-)
Да нет, я вообще-то ничего против не имею...
RomikChef:
ну и кривизна...
Просто после такой реакции вообще писать в форум не хочется. Я понимаю, что ты так привык, но все таки...
[OFF]Я привел самое быстрое решение, человек вообще не знал, как к задаче подойти. Благодаря нашей полемике у него есть выбор[/OFF]
-
может быть, оно и самое быстрое, но кто скажет, что оно не кривое - пусть первый бросит в меня камень.
-
RomikChef:
оно и самое быстрое,
я имел в виду не самое быстрое, а быстрее всего мной найденное :) признаю, что про функцию mktime сначала даже не подумал. Что поделать, у тебя многолетний опыт :)
-
[off]
Yukko
RomikChef
Флеймить заканчиваем [/off]
-
а никто (в данном случае) и не флеймит.
разговор идет чисто технологический.
да и тот уже закончен
-
RomikChef
твой скрипт подходит, только он в некоторых случаях неверно вывводит резулльтат.
Например сегодня 3 сентября 2003. на сервере я ставлю 20 сентебря 2003 года и получаю следующее
--------------------------
19.09.03 [-1]
17.10.03 [27]
21.11.03 [62]
19.12.03 [90]
-----------------------------
Если можно подправб чтоб он выводил правильно. Плиз!
-
Вот чудак! Тябя же предупреждали, что "нету проверки на то, что пятница уже прошла".
Отрицательные значения в скобках как раз и говорят об этом.
Просто не выводи их - и все.
-
если б я знал как ....
-
Строку
echo date("d.m.y",$friday),"(".ceil(($friday-time())/(60*60*24)).")
\\n";
заменяем на три
$days_left = ceil(($friday-time())/(60*60*24));
$days_left = ($days_left>0)?($days_left): ("Уже прошла");
echo date("d.m.y",$friday),"(".$days_left.")
\\n";
[OFF]Каежется кому-то на этом форуме скоро надо будет сорваться в Кривой рог за пивом...[/OFF]
-
впринципе почти то, спасибо огромное, но прикол вот в чём
что если случается такое что первая дата в списке уже прошла, то она показываться не должна, но в таком случае в конец списка должна добавляться ещё одна дата.....