Всем доброго дня. Собственно вопрос по заголовку. Кто нибудь реализовал вычисление дня недели по дате.
Я реализовывал. Есть алгоритм, в интернете найти не проблема. В ЧРВ нет дня недели, во всяком случае в тех, с котооыми я сталкивался.
как это нету? Даже тупая DS1307 умеет выдавать день недели. Но можно и вычислить, если очень надо: Код (C++): // в данной версии данные хранятся не в двоичной, а в двоично-десятичной системе unsigned char myhour, mymin, mysec, // текушее время mydate, mymonth, myyear, // текущий календарь myday; // день недели // -------------------- вычислить день недели по дате -------------------------------------- void date2day(void) { unsigned int y, m; y = bcd2bin(myyear); m = bcd2bin(mymonth); if (m > 2) { m -= 2; } else { m += 10; y--; } myday = (unsigned char)((bcd2bin(mydate) + y + (y>>2) + ((31 * m) / 12)) % 7); if (myday == 0) myday = 7; }//-----------------------------------------------------------------------------------------
Вот один из способов: Код (C++): byte doWeekCalc (byte DD, byte MM, byte YY) { // вычисление дня недели byte doW; doW = (YY / 12) + (YY % 12) + ((YY % 12) / 4); // индекс года byte iiM[] = {6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; // индекс месяца в табл doW += iiM[MM - 1]; // индекс месяца выбраный if ((YY % 44) == 0) { // индекс високосного года if ((MM == 1) or (MM == 2)) doW--; } doW += DD; // индекс дня doW = (doW % 7); return doW; } Он рабочий, но где то у меня есть короче, найти пока не могу, не дома я.
Согласен с Tomasina, вот вырезка из даташита на DS1307 Код (C++): Характеристики ........ - часы реального времени (RTC) отсчитывают секунды, минуты, часы, дату месяца, месяц, день недели и год с компенсацией високосного года, действительной до 2100 года; ......
Из этого сначала нужно вырезать саму дату и время. При помощи функций работв с текстом. По моему если день недели там и есть, то он не вычисляется из даты, а так же должен быть установлен вместе с часами и батарейкой.
разумеется, надо заранее установить корректные дату и время, само оно не образуется, расчета в ней нет.