|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Alexandr Leykin 2:4613/1.82 06 Jun 2001 00:37:52 To : Oleg I. Khovayko Subject : Re^2: День недели -------------------------------------------------------------------------------- 05 июня 2001 года (а было тогда 17:24) Oleg I. Khovayko в своем письме к All писал(а): >> Хотелось бы узнать способ вычисления дня недели произвольного >> года/месяца/дня. То есть дана дата - нужно узнать день недели, >> приходящийся на эту дату. OK> Есть функция Целлера (Zeller?), которая это и делает. OK> Была приведена в книге "Введение в C для профессионалов", OK> изданной где-то в 91 году. Зачем так сложно: В рамках григорианского календаря (который исполузуют сейчас в европе) с 1583 года: D,M,Y - Дата в полном формате (24.05.1999) Март - первый месяц (для удобства смещения) Смешение года: S=Int((12-M)/10) Hомер смещенного месяца: M=12*S+M-2 Hомер смещенного года: Y=Y-S Hомер даты: N=Int(365.25*Y)-Int(Y/100)+Int(Y/400)+Int(30.59*M)+D-30 /1/ /2/ /3/ /1/ Високосная часть 365*Y - колличество дней в Y годах Год високосный если: номер не делиться на 100, но делиться на 4, если делиться на 100 и делиться на 400 Поправка на високосность: Int(Y/4)-Int(Y/100)+Int(Y/400) Складываем, получаем 365*Y+Int(Y/4)-Int(Y/100)+Int(Y/400)=Int(365.25*Y)-Int(Y/100)+Int(Y/400) /2/ Месяц 30*(M-1)+Int(0.59*M) 30*(M-1) - колличество дней в M месяцах Int(0.59*M) - поправка на день (30 или 31) начиная с марта (февраль-последний) Складываем, получаем Int(30.59*M) /3/ Текущий день +D - добавляем колличество прошедших дней, -30 - корректировка возврата в текущий месяц, так как номер месяца показывает не конец предидущего, а начало следующего. Складываем, получаем +D-30 День недели: N(D,M,G)-N(известной) mod 7 С уважением, Alexandr 06 июня 2001 года --- * Origin: В кругу друзей не щелкай интерфейсом (2:4613/1.82) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/27723b1d7ec4.html, оценка из 5, голосов 10
|