Re: ISO week number
От: conraddk Россия  
Дата: 05.07.04 16:48
Оценка: 36 (1)
Здравствуйте, Кодт, Вы писали:

К>Помогите с формулой, пожалуйста. Весь день головой об стол стучу, что-то никак.


К>Дано: дата (день,месяц,год).


К>Номер недели по ISO — это число 1..53

К>неделя начинается с понедельника
К>первая неделя должна включать в себя первый четверг года
К>нулевая неделя — это 52 или 53 (т.е. относится к прошлому году)

К>Можно пользоваться WinAPI.


Предположим, что мы умеем получать день недели в виде 0,1,2..6 (0 — понедельник, 6 — воскресенье) и день года, тоже индексированный от нуля. Тогда вроде бы должно работать примерно следующее:
// дано d, m, y
// день недели на данную дату
int curDOW = DayOfWeek( d, m, y );
// день недели 1 января данного года
int baseDOW = DayOfWeek( 1, 1, y );
// день в году
int curDOY = DayOfYear( d, m, y );
// если год начинается с пн, вт, ср, чт, 
// то 1 января - первая неделя, иначе - нулевая
int baseWeek = baseDOW<4 ? 1 : 0;
// грубо: номер нашей недели - это 
// номер недели 1 января + количество целых недель
int isoWeek = baseWeek + curDOY / 7;
// коррекция: если данный день раньше в неделе, чем 1 января, 
// то на самом деле неделя уже другая (следующая)
if( curDOW < baseDOW )
  ++isoWeek;
... << RSDN@Home 1.1.3 stable >>
Все на свете должно происходить медленно и неправильно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.