(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;