Перейти к содержанию
    

Электронный календарь

Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 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;
    }

 

Но учтите, что код писан левой ногой и очень давно на заре туманной юности  :), даю только для примера (нулевая точка 2000год, код для c51). Вы пишите более рационально - без лишних делений, глобальных переменных и т.д. 

ЗЫ Сейчас самому страшен такой код, хотя я не так далеко и продвинулся, может стереть пример, дабы людей не смешить :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 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;
    }
}

 

Ну, а со временем суток, я думаю, сами справитесь...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Премного благодарен!

Изменено пользователем rezident
Нарушение п.3.4 Правил форума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реализовывал, но в пределах от 2000 до 2099 года. Если устроит, есть функции перевода из секунд в дату, из даты в секунды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так

//-------------------------------------------------------------
//    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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет.

 

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

 

Если нужен день недели (автоматически рассчитываемый по дате), то лучше делать иначе - в счетчике RTC держать и дату и время (аппаратно). Получать значения при необходимости. Формулы выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...