如何在 C 中给定日期获取 GPS 周数?

How can I get the GPS week number given a date in C?

我有一个日期:171115 183130 (17-11-15 18:31:30)。我使用的 API 要求我根据周数提供日期,但由于它用于 GPS 服务,因此需要是从 1980 年(第一个纪元)开始计算的周数

我在 C 中找不到任何考虑跳跃的库 days/seconds。有什么想法吗?

例如,周 1873 应该是 2015 11 30

由于日期分别显示星期和时间,因此您无需担心闰秒。

使用 C 库 API 将 DDMMYY 转换为自 C 纪元 (1/1/1970) 以来的秒数,减去到 1/1/1980 的秒数并除以结果按 7*24*3600 得到从 1/1/1980 开始经过的周数。

通过使用 difftime() 无需假设 1970 年 1 月 1 日纪元。 difftime() returns 2 个时间戳中的秒数差异 (double)。 return 值与用于 time_t.

的数字类型和纪元无关

使用 mktime() 将 YMD 转换为 time_t
未决问题:OP post

中未提及时区
#include <stdio.h>
#include <time.h>

time_t TimeFromYMD(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(TimeFromYMD(year, month, day), TimeFromYMD(1980, 1, 1));
  return (int) (diff / SECS_PER_WEEK);
}

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

输出

1873