⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps定位程序时间转换.txt

📁 GPS应用和数据处理中
💻 TXT
字号:
时间转换源代码--GPS定位程序2008-11-16 21:202008年11月01日 星期六 23:01               GPS应用和数据处理中,会涉及到许多不同的时间表示法,如GPS系统内部所采用的GPS时标示法,GPS测量应用中常常采用年积日标示法,在科学领域采用儒略日标示法,日常生活中采用历法标示法等,不同的时间标示有不同的目的,它们之间是可以严格的进行互相转换的,下面是各种时间标示的转换源代码:

头文件

#ifndef __TIMECONVERT_H
#define __TIMECONVERT_H


const long _MINUTE_IN_SECOND = 60L;
const long _HOUR_IN_MINUTE   = 60L;
const long _DAY_IN_HOUR   = 24L;
const long _WEEK_IN_DAY   = 7L;
const long _HOUR_IN_SECOND   = _HOUR_IN_MINUTE * _MINUTE_IN_SECOND;
const long _DAY_IN_SECOND   = _DAY_IN_HOUR * _HOUR_IN_SECOND;
const long _WEEK_IN_SECOND   = _WEEK_IN_DAY * _DAY_IN_SECOND;


typedef struct tagCOMMONTIME {
unsigned short year;
/*unsigned short month;
unsigned short day;
unsigned short hour;
unsigned short minute;*/

unsigned char month;
unsigned char day;
unsigned char hour;
unsigned char minute;
double    second;
} COMMONTIME;//通用时

typedef COMMONTIME *PCOMMONTIME;


typedef struct tagTOD {
long sn;
double tos;
} TOD;

typedef TOD *PTOD;


typedef struct tagJULIANDAY {
long day;
TOD   tod;
} JULIANDAY;//儒略时

typedef JULIANDAY *PJULIANDAY;


typedef struct tagMJulianDay {
long day;
TOD   tod;
} MJulianDay;//简化儒略日

typedef MJulianDay *PMJulianDay;


typedef struct tagTOW {
long sn;
double tos;
} TOW;

typedef TOW *PTOW;


typedef struct tagGPSTIME {
int   wn;
TOW   tow;
} GPSTIME;//GPS时

typedef GPSTIME *PGPSTIME;


typedef struct tagDOY {
unsigned short year;
unsigned short day;
TOD     tod;
} DOY;

typedef DOY *PDOY;


void CommonTimeToJulianDay (PCOMMONTIME pct, PJULIANDAY pjd);
void JulianDayToCommonTime (PJULIANDAY pjd, PCOMMONTIME pct);
void JulianDayToGPSTime (PJULIANDAY pjd, PGPSTIME pgt);
void GPSTimeToJulianDay (PGPSTIME pgt, PJULIANDAY pjd);
void CommonTimeToGPSTime (PCOMMONTIME pct, PGPSTIME pgt);
void GPSTimeToCommonTime (PGPSTIME pgt, PCOMMONTIME pct);
void CommonTimeToDOY (PCOMMONTIME pct, PDOY pdoy);
void DOYToCommonTime (PDOY pdoy, PCOMMONTIME pct);
void GPSTimeToDOY (PGPSTIME pgt, PDOY pdoy);
void DOYToGPSTime (PDOY pdoy, PGPSTIME pgt);
void JulianDayToDOY (PJULIANDAY pjd, PDOY pdoy);
void DOYToJulianDay (PDOY pdoy, PJULIANDAY pjd);
double GetTimeDelta (PJULIANDAY pjd1, PJULIANDAY pjd2);
void SetTimeDelta (PJULIANDAY pjdNew, PJULIANDAY pjdOld, double dDelta);

#endif

           源文件:

#include "TimeConvert.h"
#include "stdlib.h"

double FRAC(double morigin)
{
return morigin-long(morigin);

}

double mod(double a,int b)
{
return (a-b*long(a/b));
}

void CommonTimeToJulianDay(PCOMMONTIME pct, PJULIANDAY pjd) 
{
int   m;
int   y;
double ut;

ut = pct->hour + pct->minute/(double)_HOUR_IN_MINUTE
   + pct->second/(double)_HOUR_IN_SECOND;

if (pct->month <= 2) {
   y = pct->year - 1;
   m = pct->month + 12;
}
else {
   y = pct->year;
   m = pct->month;
}

pjd->day   = (long)(365.25*y) + (long)(30.6001*(m+1))
   + pct->day + (long)(ut/24 + 1720981.5);
pjd->tod.sn   = ((pct->hour+12)%_DAY_IN_HOUR)*_HOUR_IN_SECOND 
   + pct->minute*_MINUTE_IN_SECOND + (long)pct->second;
pjd->tod.tos = pct->second - (long)pct->second;
}


void JulianDayToCommonTime (PJULIANDAY pjd, PCOMMONTIME pct)
{

int a,b,c,d,e;
double JD;
JD=pjd->day+(pjd->tod.sn+pjd->tod.tos)/_DAY_IN_SECOND;

a=static_cast<int>(JD+0.5);
b=a+1537;
c=static_cast<int>((b-122.1)/365.25);
d=static_cast<int>(365.25*c);
e=static_cast<int>((b-d)/30.6001);
/*pct->day=short(b-d-(long)(30.6001*e)+FRAC(JD+0.5));
pct->month=short(e-1-12*(long)(e/14));
pct->year=short(c-4715-(long)((7+pct->month)/10));

pct->hour=(short)(pjd->tod.sn/_HOUR_IN_SECOND)+12;
    if(pct->hour>=24)
   pct->hour-=24;
pct->minute=(short)((pjd->tod.sn%_HOUR_IN_SECOND)/_MINUTE_IN_SECOND);*/
pct->day=b-d-(long)(30.6001*e)+FRAC(JD+0.5);
pct->month=e-1-12*(long)(e/14);
pct->year=c-4715-(long)((7+pct->month)/10);

pct->hour=pjd->tod.sn/_HOUR_IN_SECOND+12;
    if(pct->hour>=24)
   pct->hour-=24;
pct->minute=(pjd->tod.sn%_HOUR_IN_SECOND)/_MINUTE_IN_SECOND;
pct->second=(pjd->tod.sn%_HOUR_IN_SECOND)%_MINUTE_IN_SECOND+pjd->tod.tos;


}


void JulianDayToGPSTime (PJULIANDAY pjd, PGPSTIME pgt)
{
double JD;
JD=pjd->day+(pjd->tod.sn+pjd->tod.tos)/_DAY_IN_SECOND;
pgt->wn=int((JD-2444244.5)/7);
    
//double JDd;
//JDd=JD-2444244.5;
//pgt->tow.sn=long(mod((JD-2444244.5),7)*_DAY_IN_SECOND);
//pgt->tow.tos=mod((JD-2444244.5),7)*_DAY_IN_SECOND
// -long(mod((JD-2444244.5),7)*_DAY_IN_SECOND);

pgt->tow.sn=long((JD-2444244.5-pgt->wn*7)*_DAY_IN_SECOND);
pgt->tow.tos=pjd->tod.tos;



}

void GPSTimeToJulianDay (PGPSTIME pgt, PJULIANDAY pjd)
{
double JD;
JD=pgt->wn*7+(pgt->tow.sn+pgt->tow.tos)/86400+2444244.5;
pjd->day=long(JD);
pjd->tod.sn=long((JD-long(JD))*_DAY_IN_SECOND);
//pjd->tod.tos=(JD-long(JD))*_DAY_IN_SECOND-long((JD-long(JD))*_DAY_IN_SECOND);
pjd->tod.tos=pgt->tow.tos;

}

void CommonTimeToGPSTime (PCOMMONTIME pct, PGPSTIME pgt)
{
PJULIANDAY pjd;
pjd=(PJULIANDAY)malloc(sizeof(JULIANDAY));

CommonTimeToJulianDay(pct,pjd);

JulianDayToGPSTime (pjd,pgt);
free(pjd);

}

void GPSTimeToCommonTime (PGPSTIME pgt, PCOMMONTIME pct)
{
PJULIANDAY pjd;
pjd=(PJULIANDAY)malloc(sizeof(JULIANDAY));

GPSTimeToJulianDay (pgt, pjd);
JulianDayToCommonTime (pjd, pct);
free(pjd);

}

void CommonTimeToDOY (PCOMMONTIME pct, PDOY pdoy)
{
PCOMMONTIME pcto;
pcto=(PCOMMONTIME)malloc(sizeof(COMMONTIME));
pcto->year=pct->year;
pcto->month=1;
pcto->day=1;
pcto->hour=0;
pcto->minute=0;
pcto->second=0;

PJULIANDAY pjdo;
pjdo=(PJULIANDAY)malloc(sizeof(JULIANDAY));

double JD,JDO;
CommonTimeToJulianDay(pcto,pjdo);
JDO=pjdo->day+(pjdo->tod.sn+pjdo->tod.tos)/_DAY_IN_SECOND;

PJULIANDAY pjd;
pjd=(PJULIANDAY)malloc(sizeof(JULIANDAY));
CommonTimeToJulianDay(pct,pjd);

JD=pjd->day+(pjd->tod.sn+pjd->tod.tos)/_DAY_IN_SECOND;

pdoy->day=short(JD-JDO+1);
pdoy->year=pct->year;

pdoy->tod.sn=long(pct->hour*_HOUR_IN_SECOND
   +pct->minute*_MINUTE_IN_SECOND+pct->second);
    pdoy->tod.tos=pct->hour*_HOUR_IN_SECOND
   +pct->minute*_MINUTE_IN_SECOND+pct->second-pdoy->tod.sn;
    
free(pcto);
free(pjdo);
free(pjd);

}

void DOYToCommonTime (PDOY pdoy, PCOMMONTIME pct)
{
PCOMMONTIME pcto;
pcto=(PCOMMONTIME)malloc(sizeof(COMMONTIME));
pcto->year=pdoy->year;
pcto->month=1;
pcto->day=1;
pcto->hour=0;
pcto->minute=0;
pcto->second=0;

PJULIANDAY pjdo;
pjdo=(PJULIANDAY)malloc(sizeof(JULIANDAY));

    double JD,JDO;
CommonTimeToJulianDay(pcto,pjdo);
JDO=pjdo->day+(pjdo->tod.sn+pjdo->tod.tos)/_DAY_IN_SECOND;

JD=JDO+pdoy->day+(pdoy->tod.sn+pdoy->tod.tos)/_DAY_IN_SECOND-1;
    
long a,b,c,d,e;

a=(long)(JD+0.5);
b=a+1537;
c=(long)((b-122.1)/365.25);
d=(long)(365.25*c);
e=(long)((b-d)/30.6001);
pct->day=short(b-d-(long)(30.6001*e)+FRAC(JD+0.5));
pct->month=short(e-1-12*(long)(e/14));
pct->year=short(c-4715-(long)((7+pct->month)/10));

pct->hour=short((pdoy->tod.sn+pdoy->tod.tos)/_HOUR_IN_SECOND);
pct->minute=short((pdoy->tod.sn+pdoy->tod.tos
   -pct->hour*_HOUR_IN_SECOND)/_MINUTE_IN_SECOND);
pct->second=pdoy->tod.sn+pdoy->tod.tos
   -pct->hour*_HOUR_IN_SECOND-pct->minute*_MINUTE_IN_SECOND;

free(pcto);
free(pjdo);

}

void GPSTimeToDOY (PGPSTIME pgt, PDOY pdoy)
{
PJULIANDAY pjd;
pjd=(PJULIANDAY)malloc(sizeof(JULIANDAY));

GPSTimeToJulianDay (pgt, pjd);
    
PCOMMONTIME pct;
pct=(PCOMMONTIME)malloc(sizeof(COMMONTIME));
JulianDayToCommonTime (pjd,pct);

    CommonTimeToDOY (pct,pdoy);
free(pjd);
free(pct);

}

void DOYToGPSTime (PDOY pdoy, PGPSTIME pgt)
{
    PCOMMONTIME pct;
pct=(PCOMMONTIME)malloc(sizeof(COMMONTIME));
DOYToCommonTime (pdoy,pct);

    CommonTimeToGPSTime (pct, pgt);
free(pct);

}

void JulianDayToDOY (PJULIANDAY pjd, PDOY pdoy)
{ 
PCOMMONTIME pct;
pct=(PCOMMONTIME)malloc(sizeof(COMMONTIME));
JulianDayToCommonTime (pjd, pct);

CommonTimeToDOY (pct,pdoy);
free(pct);
}

void DOYToJulianDay (PDOY pdoy, PJULIANDAY pjd)
{
PCOMMONTIME pct;
pct=(PCOMMONTIME)malloc(sizeof(COMMONTIME));
DOYToCommonTime (pdoy,pct);
   
CommonTimeToJulianDay(pct,pjd);
free(pct);
}

//
//IF pjd1>pjd2 OUT delta=pjd1-pjd2
//IF pjd1<pjd2 OUT delta=pjd2-pjd1
double GetTimeDelta (PJULIANDAY pjd1, PJULIANDAY pjd2)
{

double JD1,JD2;
JD1=pjd1->day+(pjd1->tod.sn+pjd1->tod.tos)/_DAY_IN_SECOND;
JD2=pjd2->day+(pjd2->tod.sn+pjd2->tod.tos)/_DAY_IN_SECOND;

if(JD1-JD2>0)
   return JD1-JD2;
else 
   return JD2-JD1;

}

//pjdNew=pjdOld+dDelta
void SetTimeDelta (PJULIANDAY pjdNew, PJULIANDAY pjdOld, double dDelta)
{
double JDold,JDnew;
JDold=pjdOld->day+(pjdOld->tod.sn+pjdOld->tod.tos)/_DAY_IN_SECOND;
JDnew=JDold+dDelta;

pjdNew->day=long(JDnew);
pjdNew->tod.sn=long((JDnew-long(JDnew))*_DAY_IN_SECOND);
pjdNew->tod.tos=(JDnew-long(JDnew))*_DAY_IN_SECOND
   -long((JDnew-long(JDnew))*_DAY_IN_SECOND);

}
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -