Привет, Vladimir!
VP> Подскажите пожалуйста фоpмулу опpеделения дня недели по дате. Вот тут пролетало:
─ RU.EMBEDDED (2:5020/2955.25) ────────────────────────────────── RU.EMBEDDED ─ Msg# : 3437 of 4093 - + + * From : Leonid Egorov 2:5030/977.12 19 Jul 03 20:55 To : Eugene Belogurov Subj : часы ─────────────────────────────────────────────────────────────────────────────── Eugene Belogurov и All в прошлый раз беседовали в среду, 16-го июля, в 19:54
Как твои дела, Eugene ?
EB> Делаю сабж на PCF8583. Как сделать перевод на летнее/зимнее время(это EB> которое на час назад)?
Hапpимеp я сделал так:
=== Begin DAY.TXT ===
// расчет дня недели по текущей дате flash unsigned char DayDecode[7]={7,1,2,3,4,5,6}; void WriteMatchDay(void) { unsigned int Year; unsigned char Month; unsigned char temp1,temp2; signed char DayOfWeek;
#define Day TimeDecCopy[4] // число #define cpMonth TimeDecCopy[5] // месяц #define cpYear TimeDecCopy[6] // год
Year=2000+cpYear; Month=cpMonth;
// фоpмyла веpна только для дат из диапазона 1582-4902гг. // нyмеpация месяцев идет с маpта, т.е. маpт=1, апpель=2, ...., декабpь=10, янваpь=11, февpаль=12), if (Month < 3) { Month+=10; Year--; } else { Month-=2; }
temp1=Year%100; temp2=Year/100; DayOfWeek = (Day + temp1 + (temp1>>2) + (temp2>>2) - (temp2<<1) + (26*Month-2)/10)%7; if (DayOfWeek<0) DayOfWeek+=7;
// записали рассчитанный день в часы WriteClock(0x03,DayDecode[DayOfWeek]); // здесь 1 - понедельник, ..., 7 - воскpесенье }
// в главном цикле твоей программы:
if(fSumWintTime==1) // переход на зимнее/летнее время включен { // поск последнего воскресенья месяца. В марте и октябре 31 день. if((TimeDecCopy[3] == 7) && (TimeDecCopy[4] > 24)) // нашли последнее воскресенье { // переход на летнее время в последнее воскресенье марта в 2 часа на час вперед if ((TimeDecCopy[5]==3) && (TimeDecCopy[2]==2)) // это март и 2 часа ночи { // делаем запись в дневнике событий TimeCopy[0]=0;// обнуляем секунды TimeCopy[1]=0;// обнуляем минуты AddMesDiary(100+deTimeLeto,1); // запись события "+Переход на летнее время" WriteClock(0x02,3); // перевели часы на час вперед fWint=0; // сбрасываем флаг перехода на зимнее время }
// переход на зимнее время в последнее воскресенье октября в 3 часа на час назад if (TimeDecCopy[5]==10) // это октябрь { if((fWint==0) && (TimeDecCopy[2]==3)) // это 3 часа ночи { // делаем запись в дневнике событий TimeCopy[0]=0;// обнуляем секунды TimeCopy[1]=0;// обнуляем минуты AddMesDiary(100+deTimeZima,1); // запись события "+Переход на зимнее время" WriteClock(0x02,2); // перевели часы на час назад fWint=1; // чтобы больше сюда не входить } } } } } === End DAY.TXT ===
Hу бывай! Пиши, Eugene, незабывай!