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

📄 timeconvert.cpp

📁 GPS观测值文件(RINEX)的读取
💻 CPP
字号:
#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 + -