周内秒(学习记录)

周内秒

理解周内秒的原理需要考虑到两个关键因素: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);  //得到周内秒的秒
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值