Forum Webscript.Ru

Программирование => PHP => Тема начата: AlieN от 12 Апреля 2002, 14:40:19

Название: Даты < 1970
Отправлено: 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.


ЧТо делать помогите?
Название: Даты < 1970
Отправлено: ThE0ReTiC от 12 Апреля 2002, 15:07:13
Сделай свой timestamp.
Берешь нужную тебе дату, находишь количество дней до 1.1.1970, делишь на 7, и по остатку находишь смещение относительно дня недели, которым было 1.1..1970.
:)
Название: Даты < 1970
Отправлено: AlieN от 12 Апреля 2002, 15:18:24
ThE0ReTiC
можно по подробнее плиз
Название: Даты < 1970
Отправлено: ThE0ReTiC от 12 Апреля 2002, 15:25:09
AlieN
Я ж тебе все расписал. Алгоритм-то понятен?
Название: Даты < 1970
Отправлено: AlieN от 12 Апреля 2002, 15:39:45
ThE0ReTiC
сурс лучше был-бы
у меня трабл найти кол-во дней
а так-то усё просто
Название: Даты < 1970
Отправлено: ThE0ReTiC от 12 Апреля 2002, 16:18:36
$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;
?>

Тут только учета високосных лет нету.
Это тебе домашнее задание :)
Название: Даты < 1970
Отправлено: AlieN от 12 Апреля 2002, 16:48:50
вроде вот так:

$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;

?>
Название: Даты < 1970
Отправлено: ThE0ReTiC от 12 Апреля 2002, 16:51:22
А я сделал так:

$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;
?>

:)
Название: Даты < 1970
Отправлено: AlieN от 12 Апреля 2002, 16:56:39
у нас несходиться вроде :(
Название: Даты < 1970
Отправлено: AlieN от 12 Апреля 2002, 17:01:29
всё бы чудненько но запусти вот это:

$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);
}
?>
Название: Даты < 1970
Отправлено: ThE0ReTiC от 12 Апреля 2002, 17:01:48
Я лебедевским парсером проверял:
http://www.parser.ru/examples/example3/calendar.html
Мое все сходится.
19 октября 1909 года - вторник и у него и у меня.

Полный код дать?
Название: Даты < 1970
Отправлено: AlieN от 12 Апреля 2002, 17:07:16
у тебя 0 - это воскресенье?
глянь плиз мой код где глюк
Название: Даты < 1970
Отправлено: AlieN от 12 Апреля 2002, 17:21:16
ThE0ReTiC
Скажи под каким цифрами что понимается*
Название: Даты < 1970
Отправлено: ThE0ReTiC от 12 Апреля 2002, 17:28:28
Лови полный код.
Бага у меня все-таки была. В обсчете пограничных дат.

$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 \'
\';
echo\'\';
echo\'День: \';
echo\'Месяц:   Год:   \';
echo \'
\';
break;
}
?>
Название: Даты < 1970
Отправлено: Dm от 12 Апреля 2002, 21:41:02
не проще ли взять готовый алгоритм?
http://www.hotscripts.com/PHP/Scripts_and_Programs/Calendars/
Название: Даты < 1970
Отправлено: ThE0ReTiC от 12 Апреля 2002, 21:52:10
Dm
Проще. Но не интересно. Всю жизнь-то не будешь на чужих алгоритмах выезжать. :)
Название: Даты < 1970
Отправлено: Dm от 12 Апреля 2002, 23:53:44
ThE0ReTiC
дело в том, что не хватает времени учится на своих ошибках.
лучше взять несколько готовых алгоритмов, внимательно  изучить/проанализировать все и создать третий вариант (для использования в своей разработке)
Название: Даты < 1970
Отправлено: AlieN от 15 Апреля 2002, 11:45:03
Спокуха мальчики и девочки: сейчас всё будет хорошо
после небольших умозаключений я добился требуемого:

                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];
Название: Даты < 1970
Отправлено: ThE0ReTiC от 15 Апреля 2002, 13:36:41
Dm
Бывает. Кому как проще :)