Forum Webscript.Ru
Программирование => PHP => Тема начата: AlieN от 12 Апреля 2002, 14:40:19
-
Существует небольшая проблемка:
требуется узнать день недели с которого начинается месяц,
грубо говоря
есть апрель 1960,
Надо узнать каким днём недели было 1 апреля
Попытка:
date("w",mktime(0,0,0,$month,1,$year));
Возвращает ошибку
ввиду (цитата из спецификации)
. This timestamp is a long integer containing the number of seconds between the Unix Epoch (January 1 1970) and the time specified.
ЧТо делать помогите?
-
Сделай свой timestamp.
Берешь нужную тебе дату, находишь количество дней до 1.1.1970, делишь на 7, и по остатку находишь смещение относительно дня недели, которым было 1.1..1970.
:)
-
ThE0ReTiC
можно по подробнее плиз
-
AlieN
Я ж тебе все расписал. Алгоритм-то понятен?
-
ThE0ReTiC
сурс лучше был-бы
у меня трабл найти кол-во дней
а так-то усё просто
-
$day = 1;
$month = 1;
$year = 1963;
$ydelta = 1970-$year;
$ddelta = 0;
$y2d = $ydelta*365;
$monts = array(31,28,31,30,31,30,31,31,30,31,30,31);
for($step=0;$step<($month-1);$step++)
{
$ddelta += $monts[$step];
}
$days = $y2d-$ddelta-$day+1;
echo $days;
$fl = $days % 7;
echo\'
\'.$fl;
?>
Тут только учета високосных лет нету.
Это тебе домашнее задание :)
-
вроде вот так:
$month=1;
$day=1;
$year=1966;
$ddelta = 0;
for($i=1969;$i>$year;--$i)
{
if($i%4==0){$y2d+=366;}
else{$y2d+=365;}
}
$monts = array(31,28,31,30,31,30,31,31,30,31,30,31);
if($year%4==0){$monts[1]=29;}
for($step=0;$step<($month-1);$step++)
{
$ddelta += $monts[$step];
}
$days = $y2d-$ddelta-$day+1;
$fl = $days % 7;
?>
-
А я сделал так:
$ydelta = 1970-$year;
$ddelta = 0;
$viskor = floor((1972-$year)/4);
$y2d = $ydelta*365+$viskor;
$monts = array(31,28,31,30,31,30,31,31,30,31,30,31);
for($step=0;$step<($month-1);$step++)
{
$ddelta += $monts[$step];
}
$days = $y2d-$ddelta-$day+1;
$fl = $days % 7;
?>
:)
-
у нас несходиться вроде :(
-
всё бы чудненько но запусти вот это:
$month=1;
$day=1;
$year=1966;
$ddelta = 0;
print "Я - ".ya($month,$day,$year)." Теоретик -".ter($month,$day,$year);
function ya($month,$day,$year)
{
for($i=1969;$i>$year;--$i)
{
if($i%4==0){$y2d+=366;}
else{$y2d+=365;}
}
$monts = array(31,28,31,30,31,30,31,31,30,31,30,31);
if($year%4==0){$monts[1]=29;}
for($step=0;$step<($month-1);$step++)
{
$ddelta += $monts[$step];
}
$days = $y2d-$ddelta-$day+1;
$NumberFirstDay = $days % 7;
return($NumberFirstDay);
}
function ter($month,$day,$year)
{
$ydelta = 1970-$year;
$ddelta = 0;
$viskor = floor((1972-$year)/4);
$y2d = $ydelta*365+$viskor;
$monts = array(31,28,31,30,31,30,31,31,30,31,30,31);
for($step=0;$step<($month-1);$step++)
{
$ddelta += $monts[$step];
}
$days = $y2d-$ddelta-$day+1;
$fl = $days % 7;
return($fl);
}
?>
-
Я лебедевским парсером проверял:
http://www.parser.ru/examples/example3/calendar.html
Мое все сходится.
19 октября 1909 года - вторник и у него и у меня.
Полный код дать?
-
у тебя 0 - это воскресенье?
глянь плиз мой код где глюк
-
ThE0ReTiC
Скажи под каким цифрами что понимается*
-
Лови полный код.
Бага у меня все-таки была. В обсчете пограничных дат.
$day_xor = array(0=>"Четверг",
1=>"Cреда",
2=>"Вторник",
3=>"Понедельник",
4=>"Воскресенье",
5=>"Суббота",
6=>"Пятница");
$mon = array(1=>\'Январь\',
2=>\'Февраль\',
3=>\'Март\',
4=>\'Апрель\',
5=>\'Май\',
6=>\'Июнь\',
7=>\'Июль\',
8=>\'Август\',
9=>\'Сентябрь\',
10=>\'Октябрь\',
11=>\'Ноябрь\',
12=>\'Декабрь\'
);
switch($action)
{
case 1:
$ydelta = 1970-$year;
$ddelta = 0;
$viskor = floor((1972-$year)/4);
$y2d = $ydelta*365+$viskor;
if (((1972-$year) % 4 == 0)AND($month > 2)):
$y2d--;
endif;
$monts = array(31,28,31,30,31,30,31,31,30,31,30,31);
for($step=0;$step<($month-1);$step++)
{
$ddelta += $monts[$step];
}
$days = $y2d-$ddelta-$day+1;
$fl = $days % 7;
echo $day.\' \'.($mon[$month]).\' \'.$year.\' - \'.$day_xor[$fl].\'
\';
break;
default:
echo \'\';
break;
}
?>
-
не проще ли взять готовый алгоритм?
http://www.hotscripts.com/PHP/Scripts_and_Programs/Calendars/
-
Dm
Проще. Но не интересно. Всю жизнь-то не будешь на чужих алгоритмах выезжать. :)
-
ThE0ReTiC
дело в том, что не хватает времени учится на своих ошибках.
лучше взять несколько готовых алгоритмов, внимательно изучить/проанализировать все и создать третий вариант (для использования в своей разработке)
-
Спокуха мальчики и девочки: сейчас всё будет хорошо
после небольших умозаключений я добился требуемого:
for($i=1970;$i>$year;--$i)
{
if($i%4==0){++$y2d;}
$y2d+=365;
}
$monts = array(31,28,31,30,31,30,31,31,30,31,30,31);
if($year%4==0){$monts[1]=29;}
for($step=0;$step<($month-1);$step++)
{
$ddelta += $monts[$step];
}
$days = $y2d-$ddelta;
$fl = $days % 7;
$day_xor = array(4,3,2,1,7,6,5);
$NumberFirstDay=$day_xor[$fl];
-
Dm
Бывает. Кому как проще :)