Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 День недели   Dmitry Reviakin   04 Jun 2001 04:38:28 
 Re: День недели   Oleg I. Khovayko   05 Jun 2001 17:24:30 
 Re^2: День недели   Alexandr Leykin   06 Jun 2001 00:37:52 
 Re: День недели   Dima \'viper_X\' CHERTSIS   05 Jun 2001 23:38:44 
 День недели   vitalie vrabie   06 Jun 2001 07:21:50 
 День недели   Stas Sokolov   07 Jun 2001 11:50:16 
Архивное /ru.algorithms/27723b1d7ec4.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional