如何在C中给出一个日期的GPS周数?

时间:2015-12-08 15:31:32

标签: c date week-number

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

我无法在C中找到任何考虑闰日/秒的库。有什么想法吗?

例如,周1873应为2015 11 30

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

使用<div id="forest-template"> <template v-for="tree in forest"> <tree v-bind:foo="tree.foo"></tree> </template> </div> 无需假设1970年1月1日。 difftime()将两个时间戳中的差异返回为秒数(difftime())。返回值与double使用的数字类型和纪元无关。

使用time_t将YMD转换为mktime() 未解决的问题:OP的帖子中未提及时区

time_t

输出

#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;
}