如何在 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
我有一个日期: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