Используйте gmtime или местное время для вычисления дней с воскресенья (то есть дня недели) и дней с 1 января (обратите внимание, что 1 января - "0" в последнем).
Произвольный бит определяет, с какого дня года начинается неделя 1: обычно это зависит только от того, какой день недели был 1 января, который, конечно, вы можете рассчитать на основе двух фрагментов информации из gmtime. Затем используйте поиск по таблице для 7 возможностей, это, вероятно, проще, чем кодирование правил.
Например, я думаю, что Outlook использует стандарт, согласно которому Неделя 1 - это первая неделя, содержащая четверг. Таким образом, если 1 января - воскресенье, то первый день недели 1 - 1 января или день 0. Остальные возможности: понедельник, -1; Вторник -2; Среда -3; Четверг -4; Пятница, 2; Суббота, 1.
Обратите внимание на отрицательные числа: «Воскресенье недели 1» на самом деле не существует в 4 из 7 случаев, но если мы представим, что это был день назад в предыдущем году, мы получим правильный ответ.
Получив это, количество дней между ним и вашей датой говорит вам номер недели: разделите на 7 и добавьте 1.
Тем не менее, я думаю, что где-то есть Windows API, который даст вам тот же номер недели, что и Outlook. Я просто не знаю, что это такое, и, конечно, если ваши правила недели 1 отличаются от правил Outlook, то, вероятно, они не очень полезны.
непроверенный код:
int firstdays[7] = { 0, -1, -2, -3, -4, 2, 1 }; // or some other Week 1 rule
struct tm breakdown;
time_t target = time_you_care_about();
_gmtime_s(&breakdown,&target);
int dayofweek = breakdown.tm_wday;
int dayofyear = breakdown.tm_yday;
int jan1wday = (dayofweek - dayofyear) % 7;
if (jan1wday < 0) jan1wday += 7;
int week1first = firstdays[jan1wday];
if (dayofyear < week1first) return 0;
return ((dayofyear - week1first)/7) + 1;
Нечто подобное, во всяком случае.