-=Sergei=- 0 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 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). Вы пишите более рационально - без лишних делений, глобальных переменных и т.д. ЗЫ Сейчас самому страшен такой код, хотя я не так далеко и продвинулся, может стереть пример, дабы людей не смешить :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shamil 2 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 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=- 0 8 июля, 2010 Опубликовано 8 июля, 2010 (изменено) · Жалоба Премного благодарен! Изменено 9 июля, 2010 пользователем rezident Нарушение п.3.4 Правил форума. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба Реализовывал, но в пределах от 2000 до 2099 года. Если устроит, есть функции перевода из секунд в дату, из даты в секунды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 8 июля, 2010 Опубликовано 8 июля, 2010 · Жалоба Вот так //------------------------------------------------------------- // 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gr9 0 21 июля, 2010 Опубликовано 21 июля, 2010 · Жалоба В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет. Полусофтовый вариант (на стр. 11 есть соответствующее предупреждение). Если нужен день недели (автоматически рассчитываемый по дате), то лучше делать иначе - в счетчике RTC держать и дату и время (аппаратно). Получать значения при необходимости. Формулы выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться