2015-12-08 4 views
1

У меня есть дата: 171115 183130 (17-11-15 18:31:30). Я использую API, который требовал от меня указать дату на основе номера недели, но поскольку для GPS-сервиса это должен быть номер недели с 1980 года (первая эпоха)Как я могу получить номер недели GPS, учитывая дату в C?

Я не нашел ни одной библиотеки в C который учитывает прыжок дней/секунд. Есть идеи?

Например, неделя 1873 должно быть 2015 11 30.

ответ

2

Использование difftime() не нужно предполагать 1 января 1970 года. difftime() возвращает разницу во 2 временных отпечатках в виде количества секунд (double). Возвращаемое значение не зависит от типа номера и эпохи, используемой для time_t.

Используйте mktime(), чтобы преобразовать YMD в time_t.
Открытый вопрос: часовой пояс, не упомянутый в сообщении ОП

#include <time.h> 

time_t TimeFormYMD(int year, int month, int day) { 
    struct tm tm = {0}; 
    tm.tm_year = year - 1900; 
    tm.tm_mon = month - 1; 
    tm.tm_mday = day; 
    return mktime(&tm); 
} 

#define SECS_PER_WEEK (60L*60*24*7) 

int GPSweek(int year, int month, int day) { 
    double diff = difftime(TimeFormYMD(year, month, day),TimeFormYMD(1980, 1, 1)); 
    return (int) (diff/SECS_PER_WEEK); 
} 

int main(void) { 
    printf("%d\n", GPSweek(2015, 11,30)); 
    return 0; 
} 
3

Поскольку дата показывает день и время отдельно, вам не нужно беспокоиться о прыжковых секундах.

Используйте API-интерфейс библиотеки C для преобразования из DDMMYY в число секунд с момента C (1/1/1970), вычитайте количество секунд до 1/1/1980 и разделите результат на 7 * 24 * 3600, чтобы получить количество недель, прошедших с 1/1/1980.