Алгоритм вычисления дня недели по дате

Данный алгоритм позволит вычислить день недели по дате, с учетом високосного года. Это может быть полезно для установки часов, чтобы пользователь явно не указывал день недели.

Алгоритм написан на языке программирования Си.

static const uint8_t daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// Вычисляет день недели любой даты начиная с 2023. Дни 1 - 31, месяцы 1 - 12, год 23 - 99
uint8_t calcDayOfWeek(uint8_t day, uint8_t month, uint8_t year) {
	uint16_t firstDayOfWeekInYear = 6; // Первый день недели в текущем году. 0 - понедельник, 1 - втор..
	uint8_t i;
	bool leapYear = false; // Признак високосного года
	// Вычислить первый день недели в указанном году.
	// 2023 году 1 января - воскресенье, день 6
	for (i = 23; i < year; i++) {
		firstDayOfWeekInYear++;
		if (((i - 1) % 4) == 0) { // Если предыдущий год был високосным то
				firstDayOfWeekInYear++;
		}
	}
	if (((year - 1) % 4) == 0) { // Если предыдущий год был високосным то
		firstDayOfWeekInYear++;
	}
	firstDayOfWeekInYear = firstDayOfWeekInYear % 7;
	// Понять, високосный ли год текущий
	if ((year % 4) == 0) leapYear = true;
	// Сложить дни прошедших месяцев
	for (i = 0; i < (month - 1); i++) {
		firstDayOfWeekInYear += daysInMonth[i];
		if (i == 1) if (leapYear) firstDayOfWeekInYear++; // Если февраль високосного года
	}
	// Прибавить искомый день
	firstDayOfWeekInYear += (day - 1);
	firstDayOfWeekInYear = firstDayOfWeekInYear % 7;
	return (uint8_t)(firstDayOfWeekInYear + 1);
}