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

问题描述 投票:2回答:2

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

我在C中找不到任何考虑闰天/秒的库。有任何想法吗?

例如,周1873应该是2015 11 30

c date week-number
2个回答
3
投票

通过使用difftime()无需假设1970年1月1日。 difftime()将2个时间戳中的差异作为秒数(double)返回。返回值与time_t使用的数字类型和纪元无关。

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

#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

3
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.