Данный алгоритм позволит вычислить день недели по дате, с учетом високосного года. Это может быть полезно для установки часов, чтобы пользователь явно не указывал день недели.
Алгоритм написан на языке программирования Си.
// Вычисляет день недели любой даты начиная с 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;
}