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

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

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

// Вычисляет день недели любой даты начиная с 2023. Дни 1 - 31, месяцы 1 - 12, год 23 - 99
// Вернёт значение с 0 по 6
uint8_t TS_calcDayOfWeek(uint8_t day, uint8_t month, uint8_t year) {
	uint16_t firstDayOfWeekInYear = 6; // Первый день недели в текущем году. 0 - понедельник, 1 - втор..
	uint8_t i;
	uint8_t leapYear = 0; // Признак високосного года
	// Вычислить первый день недели в указанном году.
	// 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 = 1;
	// Сложить дни прошедших месяцев
	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-12) и года (0-99)
uint8_t TS_GetDaysInMonth(uint8_t month, uint8_t year) {
	if ((!month) || (month > 12)) return 0;
	uint8_t tempDaysInMonth;
	tempDaysInMonth = daysInMonth[month-1];
	if ((month == 2) && (!(year % 4))) tempDaysInMonth++;
	return tempDaysInMonth;
}