████ OS/2 Hello, наиглубокоуважаемейший Oleg!
24 Jul 05 20:39, Oleg Krasilnikov wrote to All: OK> Может быть кто-нибудь поделится алгоритмом преобразования времени OK> GPS (оно представлено в виде: номер_недели
/ номер_секунды_в_неделе) в OK> привычные нам дату и время (число / месяц
/ год, час / мин
/ сек), да OK> еще и с учетом перехода на зимнее / летнее время ?
OK> "В лоб" задача, понятно, решается, но уж больно коряво...
Вот две ф-ции, реализованные на 16-ти битном МК Fujitsu:
1-ая складывает только время в структуру.
2-ая возвращает дату. Если будут вопросы - то только по е-мылу в тирлайне.
=== Cut === #define SPW 7.*24*60*60
// Функция високосности года int is_vis_year(int y) { if ((!(y%4))&&(y%100)||(!(y%1000))) return(1); else return(0);}
void tow2time(tgps_info* gpsi) { float tow, tod; unsigned int week; byte dow; tow = gpsi->tow - gpsi->gps_ofs + gpsi->utc_ofs * 60. * 60.; //correct tow week = gpsi->week; if (tow >= SPW) { tow -= SPW; //correct tow week++; //correct GPS week }; dow = floor(tow /24. /60. /60.); //Day of week tod = tow - dow * 24. * 60 * 60; //time of day[secs] gpsi->timh = floor(tod / 60 / 60); gpsi->timm = floor((tod - gpsi->timh * 60. * 60) / 60); gpsi->tims = floor(tod - gpsi->timh * 60 * 60 - gpsi->timm * 60); };
void get_gps_date(tgps_info* gpsi, int *_year, int *_month, int *_day, int
*_dow) { unsigned int tz, week, yyyy, mm, dow, day; int day_in_month[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; float gps_utc_ofs, tow;
tow = gpsi -> tow; week = gpsi -> week; gps_utc_ofs = gpsi -> gps_ofs; tz = gpsi -> utc_ofs;
tow = tow - gps_utc_ofs + (tz * 3600); if (tow < 0) { tow += SPW; week--; } if (tow >= SPW) {tow -= SPW; week++; }
dow = (int)(tow / 86400); day = 5 + week * 7 + dow; // (day == 5) means 06 january mm = 0; yyyy = 1980; // 6 January 1980, Sunday
while (day >= 365+is_vis_year(yyyy)) day = day - 365 - is_vis_year(yyyy++);
day_in_month[1] = 28 + is_vis_year(yyyy); mm = 0;
while ((day+1) >= day_in_month[mm]) day -= day_in_month[mm++]; //dey of month *_year = yyyy; *_month = mm+1; *_day = day+1; *_dow = dow; // printf("yyyy=%d\nmm=%d\ndd=%d\ndow=%d",yyyy,mm,dd,dow);
}
=== Cut ===
С уважением! Павел. Suzuki VX-800 1936 AE 77