周内秒
理解周内秒的原理需要考虑到两个关键因素:Unix时间戳和GPS时间系统。
Unix时间戳:
Unix时间戳是从1970年1月1日00:00:00 UTC(协调世界时)开始的秒数,通常以整数形式表示。
Unix时间戳为了在计算机系统中方便表示和处理时间而被广泛采用。
GPS时间系统:
GPS时间系统以周为单位进行计数,起始于1980年1月6日00:00:00 UTC。
GPS周内的秒数是指一个给定时间点在当前GPS周内的秒数。
理解周内秒的原理如下:
将Unix时间戳转换为GPS时间:
首先,将1970年1月1日的Unix时间戳(0秒)转换为GPS时间系统中的时间。这通常需要考虑到GPS时间与UTC时间之间的差异。
通常,这个转换是通过考虑两个系统之间的偏移量来完成的。例如,GPS时间比UTC时间晚了几秒,这个偏移量通常是已知的。
确定当前GPS周:
计算给定时间点所在的GPS周数。这通常是通过将Unix时间戳转换为GPS时间,然后除以一周的秒数来实现的。
计算周内秒数:
将给定时间点的Unix时间戳转换为GPS时间,然后计算该时间点与当前GPS周起始时间之间的秒数差。这将给出给定时间点在当前GPS周内的秒数。
总之,理解周内秒的原理需要将Unix时间戳转换为GPS时间,然后确定给定时间点所在的GPS周,并计算该时间点在当前GPS周内的秒数。
部分代码示例
//定义周内秒结构体
typedef struct {
int week;
double weekSecs;
} UtcWeekData_t, *pUtcWeekData_t;
//定义时间戳结构体
typedef struct {
int64_t time;
double sec;
} gtime_t;
/**
* @brief 获取 GPS 周数和该周内的秒数
* @param[in] t 时间戳
* @param[in] week 获取周内秒的周
* @return 返回 周内秒的秒
*/
double time2gpst(gtime_t t, int *week)
{
int64_t sec = t.time; //得到了从 1970 年 1 月 1 日开始的秒数
int w = (int)(sec/(86400*7)); //总秒数除以一周的秒数来计算 GPS 周数
if (week) *week = w; //得到周内秒的周 #如果传入的 week 指针不为空,则将计算得到的 GPS 周数 w 存储到指针所指向的位置
return (double)(sec-w*86400*7) + t.sec; //计算并返回给定时间 t 在当前 GPS 周内的秒数。这是通过将总秒数减去完整的 GPS 周数对应的秒数得到该周内的剩余秒数,然后加上秒部分 t.sec,以确保精确到小数秒
}
/**
* @brief 获取 UTC 周数和该周内的秒数
* @param[in] pUtcWeek 获取周内秒
* @param[in] utcMs UTC时间
* @return 返回
*/
void UtcMsToUtcWeekSecs2(pUtcWeekData_t pUtcWeek, uint64_t utcMs)
{
gtime_t t = {0};
t.time = utcMs / 1000; //从 1970 年 1 月 1 日开始的秒数
t.sec = ((utcMs % 1000) * 1.0) / 1000.0; //取得给定时间的毫秒部分,得到了秒以下的精确度部分
pUtcWeek->weekSecs = time2gpst(t, &pUtcWeek->week); //得到周内秒的秒
}