Unix时间转周秒时间

(1)首先需要明确unix时间是UTC的unix时间还是gps的unix时间;

(2)有时需要加上或者减去18秒的跳秒;

(3)本地时间 = UTC+时区差  (北京时间 = UTC+8)

        GPS时间与UTC时间差了一个闰秒。闰秒数在下行的导航电文中有反应。GPGGA和GPRMC中本身已经将GPS时间转换为UTC时间了。

   北京时间=GPS时+8小时-闰秒。

(4)协调世界时(UTC , Universal Time Coordinated)是我们日常生活所用的时间,是一种折衷的时间尺度,它用原子时的速率,而在时刻上逼近世界时,所用方法就是“闰秒”,当协调世界时和世界时之差即将超过±0.9秒时,就对协调世界时作一整秒的调整。UTC在本质上还是一种原子时,因为它的秒长规定和原子时秒长相等,只是在时刻上,通过人工干预(闰秒),尽量靠近世界时。方法是:必要时对协调世界时作一整秒的调整(增加1秒或去掉1秒),使UTC和世界时的时刻之差保持在±0.9秒以内。这一技术措施就称为闰秒(或跳秒),增加1秒称为正闰秒(或正跳秒);去掉1秒称为负闰秒(或负跳秒)。是否闰秒,由国际地球自转服务组织(IERS)决定。闰秒的首选日期是每年的12月31日和6月30日,或者是3月31日和9月30日。如果是正闰秒,则在闰秒当天的23时59分59秒后插入1秒,插入后的时序是:…58秒,59秒,60秒,0秒,…,这表示地球自转慢了,这一天不是86400秒,而是86401秒;如果是负闰秒,则把闰秒当天23时59分中的第59秒去掉,去掉后的时序是:…57秒,58秒,0秒,…,这一天是86399秒。

最近的一次闰秒是在2005年底实施的。2005年7月4日,国际地球自转服务组织(IERS)发布C公报,协调世界时(UTC)将在2005年底实施一个正闰秒,即增加1秒。届时,所有的时钟将拨慢1秒。

(5)明确unix时间是10位,13位还是16位的,单位是否是秒?否则需要除以一个响应的位数。如果是10位,则单位是秒的unix时间,13位是单位为毫秒的unix时间,16位单位是微秒的unix时间。

double preTime = dUnix_time / 1000000;
int nTime = floor(preTime);
double dTime = preTime - nTime;    //得到毫秒
QDateTime datetime = QDateTime::fromTime_t(nTime);//或者使用QDateTime::fromTime_t(nTime).toUTC()转换为UTC的时间
QDate date = datetime.date();
int dayofweek = date.dayOfWeek() % 7;

double number = dayofweek * 24 * 3600;
int hour = datetime.time().hour();
int minute = datetime.time().minute();
int second = datetime.time().second();
number = number + hour * 3600 + minute * 60 + second + dTime;

在C语言中,GPS时间是以协调世界时(Coordinated Universal Time, UTC)为基础的,通常表示为连续数目的(Week Number)加上剩余的小数值(即星期数和毫)。要将GPS时间换为北京时间,你需要考虑以下几个步骤: 1. 获取UTC时间:首先,你需要从GPS数据中提取出UTC时间数、星期数以及毫部分。 2. 换到Unix时间戳:UTC时间乘以7天(因为一有7天,一共有604800),再加上GPS数对应的开始时间(大约1980年1月6日的闰调整)作为Unix时间戳。 3. 根据中国时差计算:北京时间比UTC快8小时。如果需要日期平移,还需要考虑到夏令时的变化。中国的夏令时期间通常是每年的三月最后一个星期六的早上1点开始,十月最后一个星期六的晚上1点结束。 4. 将Unix时间戳换为本地日期和时间:可以使用`time_t`结构体和相关的函数如`gmtime_r()`(获取格林尼治标准时间的结构)和`localtime_r()`(换为本地时间)。 ```c #include <stdio.h> #include <time.h> // GPS数和余数换为Unix时间戳 long long gps_to_unix(int weeks, int julian_seconds) { // ...这里计算闰和总数... } // 换为北京时间 struct tm bj_time; time_t utc_time = gps_to_unix(weeks, ...); gmtime_r(&utc_time, &bj_time); // 获得UTC时间 bj_time.tm_hour += 8; // 加上8小时时差 // 输出北京时间 char time_str[64]; strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", &bj_time); printf("北京时间: %s\n", time_str);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值