Здравствуйте, Кодт, Вы писали:
К>Помогите с формулой, пожалуйста. Весь день головой об стол стучу, что-то никак.
К>Дано: дата (день,месяц,год).
К>Номер недели по 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 >>