часы

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

Reply to
Leonid Egorov
Loading thread data ...

Привет Eugene!

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

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

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

[поскипано]

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

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

Reply to
Alex Mogilnikov

Hello Eugene!

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

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

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

Anatoly

Reply to
Anatoly Mashanov

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

Reply to
Alexey G. Nalimov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.