часы

Jul 19, 2003 3 Replies

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, незабывай!


Привет Eugene!

19 Jul 03 20:55, Leonid Egorov писал Eugene Belogurov:

EB>> Делаю сабж на PCF8583. Как сделать перевод на летнее/зимнее EB>> время(это которое на час назад)?

LE> Hапpимеp я сделал так:

[поскипано]

Я рекомендую в общем случае в аппаратных часах держать всегда UTC или зимнее время и _никогда_ их не переводить, а при считывании с них времени делать проверку на "лето". Hу и при ручной установке конечно.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Я удалю твою жажду. Без возможности восстановления.

Hello Eugene!

16 Jul 31 19:54, Eugene Belogurov wrote to All:

EB> Делаю сабж на PCF8583. Как сделать перевод на летнее/зимнее время(это EB> которое на час назад)?

Вообще не делать. Считать вpемя в UTC и пеpесчитывать его в летнее или зимнее пpогpаммно.

Anatoly

Вполне логично. Мы тоже так делаем, причем в самом приборе флагов зима/лето вообще нет - он возвращает UNIXTIME. Переводы делаются в софте, который графики/отчеты делает. Кстати сырки для конвертации во все стороны есть в линуксе в открытом виде.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required