Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Электронный календарь
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
-=Sergei=-
Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ?
barabek
Цитата(-=Sergei=- @ Jul 8 2010, 22:43) *
Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ?

Ну и считайте: в минуте 60 сек, далее 60 мин, 24часа, далее дни, месяцы и годы с учетом количества дней в месяцах и добавочном дне високосных годах. Вопрос то в чем? Для примера :


Код
//                                                                               ян фв мр ап мй ин ил ав сн ок нб дек
unsigned int code mounth_end[12]={31,28,31,30,31,30,31,31,30,31,30,31};

unsigned char xdata RTCcapture[6];
enum {YEAR,MONTH,DAY,HOUR,MINUTE};

                                  
void ConvertArrToTime(void)
    {
     unsigned long ticks;
         unsigned char i;
         ticks=*(unsigned long*)RTCcapture;
         ticks/=60;
         RTCcapture[MINUTE]=ticks%60;
              ticks/=60;
         RTCcapture[HOUR]=ticks%24;
         ticks/=24;

         RTCcapture[YEAR]=ticks/(365*4+1);    //учитываем високосные года
         ticks-=RTCcapture[YEAR]*(365*4+1);
         i=ticks/365;
         ticks-=i*365;
         RTCcapture[YEAR]=RTCcapture[YEAR]*4+i;
         for(i=0;i<11;i++)
             {
                  if(i==1 && !(RTCcapture[YEAR]&0x03))                    //високосный февраль
                           {if(ticks>=29)ticks-=29;else break;}
                  else
                           {if(ticks>=mounth_end[i])ticks-=mounth_end[i];else break;}
             }
         RTCcapture[MONTH]=i+1;
         RTCcapture[DAY]=ticks+1;
    }


Но учтите, что код писан левой ногой и очень давно на заре туманной юности  smile.gif, даю только для примера (нулевая точка 2000год, код для c51). Вы пишите более рационально - без лишних делений, глобальных переменных и т.д. 
ЗЫ Сейчас самому страшен такой код, хотя я не так далеко и продвинулся, может стереть пример, дабы людей не смешить smile.gif
Shamil
Цитата(-=Sergei=- @ Jul 8 2010, 17:43) *
Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ?

Код
//
// Переводит кол-во секунд с 00:00:00 1-го января 2000 года
// в день, месяц, год
//
u_int32    ToGregorData(u_int32 SecondQn)
{
    u_int32 d = SecondQn / 86400 + 2451544;
    u_int32 Z = d+1;
    u_int32 A = Z;
    if( Z >= 2299161 )
    {
        u_int32 Alpha = ((Z*4-7468865) / 146097);
        A = Z + 1 + Alpha - Alpha/4;
    }

    {
        u_int32 B = A + 1524;
        u_int32 C = (B*40 - 4884) / 14610;
        u_int32 D = (1461 * C)/4;
        u_int32 E = ((B - D)*10000/306001);
        u_int32 Day = B - D - (306001 * E)/10000;

        u_int32 Month = E - 13;
        u_int32 Year = C - 4715;

        if( E < 14 )
            Month = E - 1;

        if( Month > 2 )
            Year = C - 4716;

        return (Day%100)*10000+(Month%100)*100+Year%100;
    }
}


Ну, а со временем суток, я думаю, сами справитесь...
-=Sergei=-
Премного благодарен!
adnega
Реализовывал, но в пределах от 2000 до 2099 года. Если устроит, есть функции перевода из секунд в дату, из даты в секунды.
adnega
Вот так
Код
//-------------------------------------------------------------
//    int    date_to_int(int y, int m, int d)
//-------------------------------------------------------------
int    date_to_int(int y, int m, int d)
{
    if(m<3)
    {
        m+=12;
        y-=1;
    }
    return ((y*1461)>>2)+((m*306+7)/10)+d-730533;
}

//-------------------------------------------------------------
//    void int_to_date(int jd, int &y, int &m, int &d)
//-------------------------------------------------------------
void int_to_date(int jd, int *y, int *m, int *d)
{
    *d=jd+730533;
    *y=((*d<<2)/1461);
    *d-=((*y*1461)>>2);
    *m=(((*d*10)-7)/306);
    if(*m==0)
    {
        *m+=12;
        *y-=1;
    }
    *d=jd-date_to_int(*y,*m,1)+1;
}
gregory812
В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет.
adnega
Цитата(gregory812 @ Jul 22 2010, 01:09) *
В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет.


Полусофтовый вариант (на стр. 11 есть соответствующее предупреждение).

Если нужен день недели (автоматически рассчитываемый по дате), то лучше делать иначе - в счетчике RTC держать и дату и время (аппаратно). Получать значения при необходимости. Формулы выше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.