Алгоритм GPS Time -> Summertime

Hello, All!

Может быть кто-нибудь поделится алгоритмом преобразования времени GPS (оно представлено в виде: номер_недели / номер_секунды_в_неделе) в привычные нам дату и время (число / месяц / год, час / мин / сек), да еще и с учетом перехода на зимнее / летнее время ?

"В лоб" задача, понятно, решается, но уж больно коряво...

С наилучшими пожеланиями Олег

Reply to
Oleg Krasilnikov
Loading thread data ...

Привет Oleg!

24 Jul 05 21:39, Oleg Krasilnikov писал All:

OK> Может быть кто-нибудь поделится алгоритмом преобразования времени OK> GPS (оно представлено в виде: номер_недели / номер_секунды_в_неделе) в OK> привычные нам дату и время (число / месяц / год, час / мин / сек), да OK> еще и с учетом перехода на зимнее / летнее время ? OK> "В лоб" задача, понятно, решается, но уж больно коряво...

Почему же? Hаверное надо номер недели умножить на 604800, прибавить номер секунды и прибавить кол-во секунд от начала эпохи до начала первой недели. А дальше можно использлвать стандартные gmtime()/localtime(). Или в неделе не всегда 604800 секунд?

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Старый глюк лучше новых двух...

Reply to
Alex Mogilnikov

AM> Почему же? Hаверное надо номер недели умножить на 604800, прибавить AM> номер AM> секунды и прибавить кол-во секунд от начала эпохи до начала первой недели. AM> А AM> дальше можно использлвать стандартные gmtime()/localtime(). Или в неделе AM> не AM> всегда 604800 секунд?

Где бы ещё был работающий localtime() в эхотажной области... Да и известно ведь, unixtime с календарным временем расходится. Стало быть не всегда 604800. :-/

Reply to
Kirill Frolov

████ 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

Reply to
Pavel Berdashkewich

Hello Pavel!

28 Jul 05 18:18, you wrote to Oleg Krasilnikov:

PB> // Функция високосности года PB> int is_vis_year(int y) { if ((!(y%4))&&(y%100)||(!(y%1000))) PB> return(1); else return(0);}

В этой функции серьезная ошибка. До ее обнаружения фуджицами, видимо, осталось

495 лет.

Anatoly

Reply to
Anatoly Mashanov

Привет Kirill!

28 Jul 05 07:53, Kirill Frolov писал Alex Mogilnikov:

KF> Где бы ещё был работающий localtime() в эхотажной области...

В newlib-1.13 все работает. Я пользуюсь. До этого действительно были проблемы, я здесь публиковал соответствующие патчи. Теперь они включены в newlib.

KF> Да и известно ведь, unixtime с календарным временем расходится. Стало KF> быть не всегда 604800. :-/

Значит придется вводить коррекцию в длительность недели. Hо это ведь в любом случае придется делать...

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Дареному письму в клуджи не смотрят.

Reply to
Alex Mogilnikov

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.