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

Jul 24, 2005 5 Replies

Hello, All!



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



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


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


Привет Oleg!

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

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

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

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

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

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

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

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

Привет Kirill!

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

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

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

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

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required