进行空间大地测量所需时间系统的相互转换
                                    
1.时间标示法
从古至今,世界各国曾出现过多种历法,如罗马历、儒略日、格里高利以及我国的农历等,目前世界上广泛采用的历法是格里高利历。
1.1.格里高利时(通用时)
格里高利历也称公历,现被世界各国广泛采用。格里高利历是一个由146097天所组成的400年周期为基础,1年的平均长度为365.2425天。根据格里高利历1年被划分为12个月。其标示时间时采用年、月、日、时、分、秒的方法。这种计时反映季节变化,与日常生活密切相关,但非连续,不利于数学表达和科学计算
1.2.儒略日
儒略日是一种不涉及年、月等概念的长期连续的记日法,在天文学、空间大地测量和卫星导航定位中经常使用。这种方法是有Scaliger与1583年提出的,为纪念他的父亲儒略而命名为儒略日。儒略日的起点订在公元前4713年(天文学上记为 -4712 年)1月1日格林威治时间平午(世界时12:00),即JD 0 指定为 4713 B.C. 1月1日12:00 UT到4713 B.C. 1月2日12:00 UT的24小时。每一天赋予了一个唯一的数字。由于儒略日数字位数太多,国际天文学联合会于1973年采用简化儒略日(MJD),其定义为 MJD = JD - 2400000.5。MJD相应的起点是1858年11月17日世界时0时。 例如1979年10月1日零时儒略日数为2,444,147.5。
1.3.GPS时
GPS系统内部所采用的时间系统是GPS时间,GPS时以1980年1月6日子夜为起点,用周数(一个星期七天)和周内的秒数来表示
1.4.年积日
所谓年积日就是指的是从每年的1月1日起开始累计的天数,计数从1开始(即每年1月1日的年积日为1),如2004年5月1日的年积日为122。用他可以方便的求出一年内两个时刻T1和T2间的时间间隔。
2.各个时间系统的相互转换
各个时间系统都有严格的转换公式,其转换的主要思想是把通用时、GPS时间、和年积日分别转换为儒略日,然后以儒略日为媒介,实现任意两个时间系统的相互转换,如下图所示:

转换思想
2.1通用时与儒略日间的相互转换
2.1.1由通用时转换到儒略日(CommonTimeToJulianDay( pct, pjd))

其中
如果M≤2,则y=Y-1,m=M+12
如果M>2,则y=Y,m=M
JD为儒略日,Y为年,M为月,D为日,UT为世界时。
2.1.2由儒略日转换到通用时(JulianDayToCommonTime( pjd, pct))

2.2通用时与GPS时间间的相互转换

2.2.1由通用时转换到GPS时间(CommonTimeToGPSTime( pct, pgt))
主要分两步进行:
第一步:计算GPS周

第二步:计算一周内的秒数
2.2.2由GPS时间转换到通用时(GPSTimeToCommonTime( pgt, pct))
第一步:由GPS时间转换到儒略日
第二步:由儒略日转换到通用时
2.3儒略日与年积日之间的相互转换
2.3.1由儒略日转换到年积日(JulianDayToDOY (pjd, pdoy))
主要分三步进行:
第一步:计算出通用时
第二步:计算出当年1月1日的儒略日
第三步:两个儒略日求差加1,得出年积日
2.3.2年积日转换到儒略日(DOYToJulianDay ( pdoy, pjd))
主要分一下两步进行:
第一步:计算出当年1月1日的儒略日JD1
第二步:年积日加JD1减1得儒略日
2.4GPS时与年积日间的相互转换
参照儒略日与年积日之间转换方法进行就可以得到结果。
GPS时转换到年积日(GPSTimeToDOY ( pgt, pdoy))
年积日转换到GPS时(DOYToGPSTime (pdoy,  pgt))
3.算例及结果
通过在VC++6.0环境下编写了各个坐标系统的相互转换,并得到了转换的结果,在试验中使用的已知数据是即使数据,取的时间是当时时间2011年1月7日19时38分45.26秒,用这个已知数据代入函数中,分别求得各个时间系统的GPS时、儒略时、年积日时,并通过各个时间系统的各自相互转换,最后输出的结果如下图所示

通过上图我们可以看出,得到的结果还是非常满意的,程序基本完成了各个时间系统的相互转换,从各个时间相互转换后得到的时间结果,并还原成转换前的数据,得到的结果都是完全符合,由此可见我们的计算结果是正确的,
4.心得体会
这次编程试验,虽说这次试验比较简单,但还是花了较长的时间,修修改改的,以前看到过类似程序,觉得自己应该没啥问题,应该很简单,自己能轻易拿下,可真做起来并不是这么一回事,总是出现一些小bug,不知道问题出在那里,明明感觉公式输入对的,语法也没啥问题,偏偏结果不对,与期望的值差别很大,最后经过调试总算解决了这些问题,比如有次明明记得公式输入是正确的,最后发现还是不小心输错了,结果导致错误。经过这次编程,这次试验,使自己的编程水平有了较大的提高,以前很多的时候都是只看程序,感觉很简单,并不自己动手,其实其中很多问题,只有自己亲自经历才知道一些简单的东西也会出问题,卡住思维,最后经过努力解决了问题,心里还是蛮开心的,有一定的成就感。经过这次试验,学到了很多东西,有比较深的感触,对VC++不像以前那么排斥了,不像以前总感觉有点儿惧怕它,现在总算不抵触他了,希望在以后的学习中能够喜欢上它。
5.附录(程序中的源代码)
#include<iostream>
using namespace std;
typedef struct tagCOMMONTIME
{
    int   year;
    int   month;
    int   day;                        
    int   hour;
    int   minute;
    double   second;
}COMMONTIME;//通用时
typedef COMMONTIME *PCOMMONTIME;  
typedef struct tagTOD
{
    long sn;  //秒数的整数部分
    double tos;//秒数的小数部分
}TOD;
typedef TOD *PTOD;
typedef struct
{
    long day; //整数天数
    TOD tod;  //一天内的秒数
}JULIANDAY;//儒略日
typedef JULIANDAY *PJULIANDAY;
typedef struct tagMJULIANDAY
{
    long day;
    TOD  tod;
}MJULIANDAY;//新儒略日
typedef MJULIANDAY *PMJIANDAY;
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;
double FRAC(double morigin)
{
    return morigin-long(morigin);// 取小数部分
}
void CommonTimeToJulianDay(PCOMMONTIME pct,PJULIANDAY pjd) //通用时到儒略日的转换
{
    if(pct->year<1900)
    {
        if(pct->year<80)
        pct->year+=2000;
        else pct->year+=1900;
    }
    double ut=pct->hour + pct->minute/60.0 + pct->second/3600.0;
    if(pct->month<=2)
    {
        pct->year-=1;
        pct->month+=12;
    }
    pjd->day=int(365.25*pct->year)+int(30.6001*(pct->month+1))+pct->day+int(ut/24+1720981.5);
    pjd->tod.sn= ((pct->hour+12)%24)*3600+pct->minute*60+(int)pct->second;//秒的整数部分
    pjd->tod.tos=pct->second-(int)pct->second;//秒的小数部分
}
void JulianDayToCommonTime(PJULIANDAY pjd,PCOMMONTIME pct)//儒略日到通用时的转换
{
    double x=pjd->day+(pjd->tod.sn+pjd->tod.tos)/(60.0*60.0*24);
    int a=int(x+0.5);
    int b=a+1537;
    int c=int((b-122.1)/365.25);
    int d=int(365.25*c);
    int e=int((b-d)/30.6001);
    pct->day=b-d-int(30.6001*e);
    pct->month=e-1-12*int(e/14);
    pct->year=c-4715-int((7+pct->month)/10);
    pct->hour=(pjd->tod.sn/3600+12)%24;
    pct->minute=(pjd->tod.sn%3600)/60;
    pct->second=pjd->tod.sn%60+pjd->tod.tos;
    int N=a%7;
}
void JulianDayToGPSTime(PJULIANDAY pjd,PGPSTIME pgt)//儒略日到GPS时的转换
{
    double x=pjd->day+(pjd->tod.sn+pjd->tod.tos)/(60.0*60.0*24);
    pgt->wn=int((x-2444244.5)/7);
    pgt->tow.sn=int(((pjd->day-2444244)%7+(pjd->tod.sn/(60.0*60.0*24)-0.5))*86400);
    pgt->tow.tos=pjd->tod.tos;
}
void GPSTimeToJulianDay(PGPSTIME pgt,PJULIANDAY pjd)//GPS时到儒略日的转换
{
    pjd->day=int(pgt->wn*7+double(pgt->tow.sn)/86400.0+2444244.5);
    pjd->tod.sn=(pgt->tow.sn+43200)%86400;
    pjd->tod.tos=pgt->tow.tos;
}
void CommonTimeToGPSTime(PCOMMONTIME pct,PGPSTIME pgt)//通用时到GPS时的转换
{
    PJULIANDAY pjd=new JULIANDAY;
    CommonTimeToJulianDay(pct,pjd);
    JulianDayToGPSTime(pjd,pgt);
}
void GPSTimeToCommonTime(PGPSTIME pgt,PCOMMONTIME pct)//GPS时到通用时的转换
{
    PJULIANDAY pjd=new JULIANDAY;
    GPSTimeToJulianDay(pgt,pjd);
    JulianDayToCommonTime(pjd,pct);
}
void CommonTimeToDOY (PCOMMONTIME pct, PDOY pdoy)
{
    PCOMMONTIME pcto=new COMMONTIME;
    pcto->year=pct->year;
    pcto->month=1;
    pcto->day=1;
    pcto->hour=0;
    pcto->minute=0;
    pcto->second=0;

PJULIANDAY pjdo=new JULIANDAY;

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

PJULIANDAY pjd=new JULIANDAY;
    CommonTimeToJulianDay(pct,pjd);

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

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

pdoy->tod.sn=long(pct->hour*3600
        +pct->minute*60+pct->second);
    pdoy->tod.tos=pct->second-int(pct->second);    /*pct->hour*3600
        +pct->minute*60+pct->second-pdoy->tod.sn;*/
}
void DOYToCommonTime (PDOY pdoy, PCOMMONTIME pct)
{
    PCOMMONTIME pcto=new COMMONTIME;
    pcto->year=pdoy->year;
    pcto->month=1;
    pcto->day=1;
    pcto->hour=0;
    pcto->minute=0;
    pcto->second=0;
    PJULIANDAY pjdo=new JULIANDAY;
    double JD,JDO;
    CommonTimeToJulianDay(pcto,pjdo);
    JDO=pjdo->day+(pjdo->tod.sn+pjdo->tod.tos)/86400;
    JD=JDO+pdoy->day+(pdoy->tod.sn+pdoy->tod.tos)/86400-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)/3600);
    pct->minute=short((pdoy->tod.sn+pdoy->tod.tos
        -pct->hour*3600)/60);
    pct->second=pdoy->tod.sn+pdoy->tod.tos
        -pct->hour*3600-pct->minute*60;
}
void GPSTimeToDOY (PGPSTIME pgt, PDOY pdoy)
{
    PJULIANDAY pjd=new JULIANDAY;
    GPSTimeToJulianDay (pgt, pjd);
    PCOMMONTIME pct=new COMMONTIME;
    JulianDayToCommonTime (pjd,pct);
    CommonTimeToDOY (pct,pdoy);
}
void DOYToGPSTime (PDOY pdoy, PGPSTIME pgt)
{
    PCOMMONTIME pct=new COMMONTIME;
    DOYToCommonTime (pdoy,pct);
    CommonTimeToGPSTime (pct, pgt);
}
void JulianDayToDOY (PJULIANDAY pjd, PDOY pdoy)
{
    PCOMMONTIME pct=new COMMONTIME;
    JulianDayToCommonTime (pjd, pct);
    CommonTimeToDOY (pct,pdoy);
}
void DOYToJulianDay (PDOY pdoy, PJULIANDAY pjd)
{
    PCOMMONTIME pct=new COMMONTIME;
    DOYToCommonTime (pdoy,pct);
    CommonTimeToJulianDay(pct,pjd);
}
void main()
{
          PCOMMONTIME pct=new COMMONTIME;
          PJULIANDAY pjd=new JULIANDAY;
          PDOY pdoy=new DOY;
          PGPSTIME pgt= new GPSTIME;
          pct->year=2011;
          pct->month=1;
          pct->day=6;
          pct->hour=19;
          pct->minute=38;
          pct->second=45.26;
           cout<<"转换之前的通用时(当地时间):";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           CommonTimeToJulianDay( pct, pjd);//通用时->儒略日的转换
           cout<<"通用时->儒略日的转换:";
           cout<<pjd->day<<"  "<<pjd->tod.sn<<"  "<<pjd->tod.tos<<endl;
           cout<<endl;
           JulianDayToCommonTime( pjd, pct);//儒略日->通用时的转换
           cout<<"儒略日->通用时的转换:";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           JulianDayToGPSTime( pjd, pgt);//儒略日->GPS时的转换
           cout<<"儒略日->GPS时的转换:";
           cout<<pgt->wn<<"  "<<pgt->tow.sn<<"  "<<pgt->tow.tos<<endl;
           cout<<endl;
           GPSTimeToJulianDay( pgt, pjd);//GPS时->儒略日的转换
           cout<<"GPS时->儒略日的转换:";
           cout<<pjd->day<<"  "<<pjd->tod.sn<<"  "<<pjd->tod.tos<<endl;
           cout<<endl;
           CommonTimeToGPSTime( pct, pgt);//通用时->GPS时的转换
           cout<<"通用时->GPS时的转换:";
           cout<<pgt->wn<<"  "<<pgt->tow.sn<<"  "<<pgt->tow.tos<<endl;
           cout<<endl;
           GPSTimeToCommonTime( pgt, pct);//GPS时->通用时的转换
           cout<<"GPS时->通用时的转换:";
              cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           CommonTimeToDOY ( pct, pdoy);//通用时->年积日
           cout<<"通用时->年积日:";
           cout<<pdoy->year<<"  "<<pdoy->day<<"  "<<pdoy->tod.sn<<"  "<<pdoy->tod.tos<<endl;
           cout<<endl;
           DOYToCommonTime (pdoy,  pct);//年积日->通用时
           cout<<"年积日->通用时:";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
           GPSTimeToDOY ( pgt, pdoy);//GPS时->年积日
           cout<<"GPS时->年积日:";
           cout<<pdoy->year<<"  "<<pdoy->day<<"  "<<pdoy->tod.sn<<"  "<<pdoy->tod.tos<<endl;
           cout<<endl;
           DOYToGPSTime (pdoy,  pgt);//年积日->GPS时
           cout<<"年积日->GPS时:";
           cout<<pgt->wn<<"  "<<pgt->tow.sn<<"  "<<pgt->tow.tos<<endl;
           cout<<endl;
           JulianDayToDOY (pjd, pdoy);//儒略日->年积日
           cout<<"儒略日->年积日:";
           cout<<pdoy->year<<"  "<<pdoy->day<<"  "<<pdoy->tod.sn<<"  "<<pdoy->tod.tos<<endl;
           cout<<endl;
           DOYToJulianDay ( pdoy, pjd);//年积日->儒略日
           cout<<"年积日->儒略日:";
           cout<<pjd->day<<"  "<<pjd->tod.sn<<"  "<<pjd->tod.tos<<endl;
           cout<<endl;
           cout<<"经过各种转换后还原得到的通用时:";
           cout<<pct->year<<" "<<pct->month<<" "<<pct->day<<" "<<pct->hour<<":"<<pct->minute<<":"<<pct->second<<endl;
           cout<<endl;
}

转自 http://blog.csdn.net/freebirdway/article/details/38846871

如有转载,请标明出处。

空间大地测量与GPS导航定位时间系统相互转换,格里高利时通用时儒略日,GPS时,年积日相互转换相关推荐

  1. matlab 年积日与年月日转换,空间大地测量与GPS导航定位时间系统相互转换,格里高利时通用时儒略日,GPS时,年积日相互转换的源代码程序...

    空间大地测量与GPS导航定位所需时间系统的相互转换(包括格里高利时(通用时),儒略日,GPS时,年积日,各个时间系统的表示及其相互之间的转换,文章末尾并附上各个时间系统相互转换的源代码程序) 进行空间 ...

  2. 中国GPS导航行业投资动态及发展战略研究报告2022-2027年版

    第一章 GPS导航的相关概述 1.1 GPS的介绍 1.1.1 GPS的定义 1.1.2 GPS的发展历程 1.1.3 GPS的广泛用途 1.2 GPS导航的概述 1.2.1 GPS导航系统的概念 1 ...

  3. 手机GPS导航软件及定位原理说明

    GPS手机要实现导航,除了硬件外,还需要软件地图的支持,俗称GPS导航软件.那么顾名思义,手机GPS导航软件也就是可以安装在手机操作平台(系统)上的导航软件.老虎地图是一款免费的GPS手机地图软件,也 ...

  4. 2022-2028年中国GPS导航行业投资分析及前景预测报告

    [报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国GPS导航行业市场行业相关概述.中国G ...

  5. PSP豪华GPS导航配套软件全攻略

    http://psp.tgbus.com/news/hack/200708/20070820101309.shtml PSP著名自制GPS地图导航软件MapThis! v0.5 正式发布了.作为一款强 ...

  6. 什么是导航与位置服务器,GPS导航和GPS定位仪与GPS定位器的区别在哪?

    也许很多人时常都能听到GPS定位器.GPS导航.GPS定位仪这三个词.但都不是很了解GPS定位器.GPS导航和GPS定位仪这三者间的区别,往往都很模糊.那么,这三者到底分别是什么设备?又有哪些我们不知 ...

  7. 车载DVD GPS导航地图围棋GPS地图

    车载DVD GPS导航地图围棋GPS地图 政府间组织是GPS导航软件,熟悉的那些谁使用手机GPS功能或车载DVD GPS功能,它被打包的PDA / PNA设备,车载DVD播放器和移动设备,如手机,蓝牙 ...

  8. gps卫星位置计算程序matlab_卫星空间大地测量中GPS周跳探测的四种方法

    有哪些习惯值得坚持LESS IS MORE,SIMPLER IS BETTER THAN MORE 今天小编给大家科普一下GPS信号处理相关的方法,主要是针对卫星空间大地测量相关的信号异常时常用的四种 ...

  9. wince 德赛西威2413_【图】GPS导航/Wince6.0系统 德赛西威迈腾车载导航改装评测_汽配中国网...

    大众新迈腾一直都是深受消费者喜爱的一款车,但是原车不带屏让习惯潮流的车主们总觉得不够满意,这位1.8T大众新迈腾车主就特地到永日音响改装德赛西威导航,并且加装了倒车后视,丰富了数字电视等多媒体影音娱乐 ...

最新文章

  1. Genome Biology:赵方庆组揭示生命早期肠道菌群演变规律及决定因素
  2. Idea-LifecycleException when deploying
  3. alert和console的区别
  4. VUE:class与style强制绑定
  5. 【论文解读】KDD20 | 图神经网络在生物医药领域的应用
  6. javascript错误处理与调试
  7. 使用工作单元UnitOfWork实现事务
  8. 周鸿祎:在360新员工入职培训上的讲话
  9. 网页滚动文字特效的代码
  10. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?
  11. java 正则 惰性匹配_正则表达式 - 贪婪与非贪婪(惰性)
  12. python3.x的改进
  13. mft按钮设计_《ZEMAX光学设计超级学习手册》一一1.2 用户界面
  14. MATLAB线性卷积圆周卷积FFT程序
  15. 汽车故障诊断技术【2】
  16. netron安装使用
  17. 奔 跑 吧 兄 弟 場 外 手 機 中 獎 活 動 是 真 的 嗎
  18. Python数据可视化:Cartopy 地理空间数据可视化
  19. 最彻底的玩客云绝育方法-避免持续读写损伤硬盘和资料
  20. 在SQL中limit 函数的使用

热门文章

  1. 10章 RxJava源码分析
  2. micropython入门 stm32_micropython(1):芯片 STM32 开发,也可以使用micropython开发,都很方便...
  3. 【NVMe2.0b 13】NVMe 标准数据结构
  4. toupper() 函数
  5. SAP中通过定制开发在寄售结算MRKO中实现发票校验功能
  6. selenium下Edge()配置错误问题
  7. 关于80端口和tomcat默认8080端口
  8. 2017计算机研究生专业排名,2017年USNews美国大学计算机硕士研究生专业排名TOP110...
  9. 手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信
  10. 勤学修身 放飞梦想4