Forum Webscript.Ru

Программирование => PHP => Тема начата: Alan от 02 Сентября 2003, 19:23:23

Название: Скрипт работы с датой!!!
Отправлено: Alan от 02 Сентября 2003, 19:23:23
Люди,помогите написать скрипт. Очень срочно нада... сам пробовал... что-то не то ...
что должен делать:
нужно выводить дату каждой третьей пятницы ближайших четырёх месяцев и сколько до неё осталось дней. примерно так:
Сентябрь :19.09.03 ( 24)   Октябрь: 17.10.03 (54)   Ноябрь : 21.11.03 (84)  Декабрь : 19.12.03 (114)

Буду очень благодарен. Одна надежда на вас....
Название: Скрипт работы с датой!!!
Отправлено: Yukko от 02 Сентября 2003, 20:13:12
выведет третью пятницу девятого месяца, с другими, думаю, разберешься, дни посчитаешь, несложно будет.
А вообще я это не писал, просто иногда надо заглядывать в мануал и читать раздел 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;
}
?>
Название: Скрипт работы с датой!!!
Отправлено: Yukko от 02 Сентября 2003, 20:17:04
только не забудь, что
Воскресенье - 0
Понедельник - 1...
Название: Скрипт работы с датой!!!
Отправлено: Меняздесьдавнонет от 02 Сентября 2003, 21:00:25
ну и кривизна...
о существовании функции mktimr ни автор скрипта, ни доброхот, который его запостил, видимо, не догадываются...
Название: Скрипт работы с датой!!!
Отправлено: Yukko от 02 Сентября 2003, 22:29:51
Цитировать
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]
Название: Скрипт работы с датой!!!
Отправлено: Меняздесьдавнонет от 02 Сентября 2003, 22:54:54
чтобы не быть голословным

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";
}  


только тут нету проверки на то, что пятница уже прошла
Название: Скрипт работы с датой!!!
Отправлено: Меняздесьдавнонет от 02 Сентября 2003, 22:56:42
а кто сказал, что я не пишу? ;-)
Название: Скрипт работы с датой!!!
Отправлено: Yukko от 02 Сентября 2003, 23:07:18
Цитировать
RomikChef:
а кто сказал, что я не пишу? ;-)

Да нет, я вообще-то ничего против не имею...
Цитировать
RomikChef:
ну и кривизна...

Просто после такой реакции вообще писать в форум не хочется. Я понимаю, что ты так привык, но все таки...
[OFF]Я привел самое быстрое решение, человек вообще не знал, как к задаче подойти. Благодаря нашей полемике у него есть выбор[/OFF]
Название: Скрипт работы с датой!!!
Отправлено: Меняздесьдавнонет от 02 Сентября 2003, 23:10:15
может быть, оно и самое быстрое, но кто скажет, что оно не кривое - пусть первый бросит в меня камень.
Название: Скрипт работы с датой!!!
Отправлено: Yukko от 02 Сентября 2003, 23:23:22
Цитировать
RomikChef:
оно и самое быстрое,

я имел в виду не самое быстрое, а быстрее всего мной найденное :) признаю, что про функцию mktime сначала даже не подумал. Что поделать, у тебя многолетний опыт :)
Название: Скрипт работы с датой!!!
Отправлено: ThE0ReTiC от 03 Сентября 2003, 10:35:20
[off]
Yukko
RomikChef
Флеймить заканчиваем [/off]
Название: Скрипт работы с датой!!!
Отправлено: Меняздесьдавнонет от 03 Сентября 2003, 12:13:51
а никто (в данном случае)  и не флеймит.
разговор идет чисто технологический.
да и тот уже закончен
Название: Скрипт работы с датой!!!
Отправлено: Alan от 03 Сентября 2003, 16:41:15
RomikChef
твой скрипт подходит, только он в некоторых случаях неверно вывводит резулльтат.
Например сегодня 3 сентября 2003. на сервере я ставлю 20 сентебря 2003 года и получаю следующее
--------------------------
19.09.03 [-1]
17.10.03 [27]
21.11.03 [62]
19.12.03 [90]
-----------------------------
Если можно подправб чтоб он выводил правильно. Плиз!
Название: Скрипт работы с датой!!!
Отправлено: Bublic от 03 Сентября 2003, 16:58:49
Вот чудак! Тябя же предупреждали, что "нету проверки на то, что пятница уже прошла".
Отрицательные значения в скобках как раз и говорят об этом.
Просто не выводи их - и все.
Название: Скрипт работы с датой!!!
Отправлено: Alan от 03 Сентября 2003, 17:49:07
если б я знал как ....
Название: Скрипт работы с датой!!!
Отправлено: Yukko от 03 Сентября 2003, 18:31:04
Строку

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]
Название: Скрипт работы с датой!!!
Отправлено: Alan от 03 Сентября 2003, 18:48:37
впринципе почти то, спасибо огромное, но прикол вот в чём
что если случается такое что первая дата в списке уже прошла, то она показываться не должна, но в таком случае в конец списка должна добавляться ещё одна дата.....