【GNSS】单点定位程序总结 二 时间系统模块

26 篇文章 7 订阅

宝藏就在这里,就看还在上这门课的学弟学妹能不能发现了

时间系统模块

1.1儒略日

时间定义与表示

儒略日(Julian day,JD)是指由公元前4713年1月1日,协调世界时中午12时开始所经过的天数,多为天文学家采用,用以作为天文学的单一历法,把不同历法的年表统一起来。如果计算相隔若干年的两个日期之间间隔的天数,利用儒略日就比较方便。

在程序中,用结构体JDTIME表示儒略日时间,结构体定义如下

1

2

3

4

5

6

7

8

9

10

11

12

/* 儒略日; */

struct JDTIME

{

    int Days;

    double FracDay;

 

    JDTIME()

    {

        Days = 0;

        FracDay = 0.0;

    }

};

 

1.2简化儒略日

 

1

2

3

4

5

6

7

8

9

10

11

12

/* 简化儒略日; */

struct MJDTIME

{

    int Days;

    double FracDay;

 

    MJDTIME()

    {

        Days = 0;

        FracDay = 0.0;

    }

};

 

时间定义与表示

1.3通用时

时间定义与表示

1

2

3

4

5

6

7

8

9

10

/* 通用时间定义; */

struct COMMONTIME

{

    unsigned short Year;

    unsigned short Month;

    unsigned short Day;

    unsigned short Hour;

    unsigned short Minute;

    double Second;

};

 

1.4GPST

时间定义与表示

1

2

3

4

5

6

7

8

9

10

11

12

13

/* GPS时间定义 */

struct GPSTIME

{

    unsigned short Week;

    double

        SecOfWeek;

 

    GPSTIME()

    {

        Week = 0;

        SecOfWeek = 0.0;

    }

};

 

1.5年积日

时间定义与表示

1.3时间系统相互转换公式与代码

1.3.1儒略日与简化儒略日

1.儒略日到简化儒略日转换公式

假设简化儒略日表示为MJD ,儒略日表示为JD 。我们可以得到JD=MJD-2400000.5

3.转换程序代码

儒略日到简化儒略日

1

2

3

4

5

6

7

bool JDTime2MJDTime(const JDTIME JD, MJDTIME*MJD)

{

 

    MJD->Days = JD.Days - 2400000 - (int)(JD.FracDay - 0.5-1);

    MJD->FracDay = FRAC(JD.FracDay + 1 - 0.5);

    return true;

}

简化儒略日到儒略日

1

2

3

4

5

6

7

bool MJDTime2JDTime(const MJDTIME MJD, JDTIME*JD)

{

   

    JD->Days = MJD.Days + 2400000 + (int)(MJD.FracDay + 0.5);

    JD->FracDay = FRAC(MJD.FracDay+0.5);

    return true;

}

1.3.2儒略日与通用时

1.儒略日到通用时转换公式

2.通用时到儒略日转换公式

JD=INT[365.25y]+INT[30.6001(m+1)]+D+UT/24+1720981.5

MJD=JD-2400000.5

其中:

       如果M2 ,则y=Y-1,m=M+12

       如果M>2 ,则y=Y,m=M

       JD 为儒略日

       Y 为年,M 为月, D为日,UT 为世界时

       INT[] 表示取实数的整数部分

3.转换程序代码

儒略日到通用时

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

bool JDTime2CommonTime(const JDTIME JD, COMMONTIME*Common)

{

    MJDTIME MJD;

    MJD.Days = JD.Days - 2400000 - (int)(JD.FracDay - 0.5 - 1);

    MJD.FracDay = FRAC(JD.FracDay + 1 - 0.5);

    int a, b, c, d, e = 0;

    double UTDay = 0;

    double UT = 0;

    a = (int)(MJD.Days + MJD.FracDay + 2400000.5 + 0.5);

    b = a + 1537;

    c = (int)((1.0*b - 122.1) / (365.25));

    d = (int)(365.25*c);

    e = (int)((b - d)*1.0 / 30.6001);

    UTDay = b - d - (int)(30.6001*e) + FRAC(MJD.Days + MJD.FracDay + 2400000.5 + 0.5);

    Common->Day = (int)(UTDay);

    Common->Month = e - 1 - 12 * (int)(e*1.0 / 14);

    Common->Year = c - 4715 - (int)((7 + Common->Month)*1.0 / 10.0);

    UT = (FRAC(UTDay) * 24.0);

    Common->Hour = int(MJD.FracDay * 24);

    Common->Minute = int((MJD.FracDay * 24 - Common->Hour) * 60);

    Common->Second = MJD.FracDay * 24 * 3600 - Common->Hour * 3600 - Common->Minute * 60;

    return true;

}

 

通用时到儒略日

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

bool CommonTime2JDTime(const COMMONTIME Common, JDTIME*JD)

{

    int y, m = 0;

    double TemptJD, UT = 0;

    if (Common.Month <= 2)

    {

        y = Common.Year - 1;

        m = Common.Month + 12;

    }

    if (Common.Month > 2)

    {

        y = Common.Year;

        m = Common.Month;

    }

    UT = Common.Hour + Common.Minute / 60.0 + Common.Second / 3600.0;

    TemptJD = (int)(365.25*y) + (int)(30.6001*(m + 1)) + Common.Day + UT / 24.0 + 1720981.5;

    JD->Days = (int)(TemptJD);

    JD->FracDay = (TemptJD)-JD->Days;

    return true;

}

1.3.3儒略日与GPST

1.儒略日到GPST转换公式

先将儒略日转换为简化儒略日

MJD=JD+2400000.5

再从简化儒略日转换GPST

GPSWEEK=INT[(MJD-44244)/7]
SECOFWEEK=(MJD-44244-GPSWEEK×7)×86400

2.GPST到儒略日转换公式

MJD=44244+GPSWEEK×7+SECOFWEEK/86400

3.转换程序代码

儒略日到GPST

1

2

3

4

5

6

bool JDTime2GPSTime(const JDTIME JD, GPSTIME*GPS)

{

    GPS->Week = (int)((JD.Days + JD.FracDay - 2400000.5 - 44244) / 7.0);

    GPS->SecOfWeek = (JD.Days + JD.FracDay - 2400000.5 - 44244 - GPS->Week * 7) * 86400;

    return true;

}

 

GPST到儒略日

1

2

3

4

5

6

7

8

bool GPSTime2JDTime(const GPSTIME GPS, JDTIME*JD)

{

    double temptJD;

    temptJD = 44244 + GPS.Week * 7 + GPS.SecOfWeek / 86400 + 2400000.5;

    JD->Days = (int)(temptJD);

    JD->FracDay = FRAC(temptJD);

    return true;

}

1.3.4简化儒略日与通用时

1.简化儒略日到通用时转换公式

JD=MJD+2400000.5,
a=INT[JD+0.5]
b=a+1537
c=INT[(b-122.1)/365.25]
d=INT[365.25×c]
e=INT[(b-d)/30.6001]
Day=b-d-INT[30.6001×e]+FRAC[JD+0.5]
Month=e-1-12×INT[e/14]
Year=c-4715-INT[(7+M)/10]
Number=mod{INT[JD+0.5],7}(Number=0,MondayNumber=7,Sunday)
Hour=INT{FRAC[MJD]×24}
Minute=INT{FRAC[MJD]×24×60-Hour×60}
Second=INT{FRAC[MJD]×24×3600-Hour×3600-Minute×60}

2.通用时到简化儒略日转换公式

MJD=INT[365.25×y]+INT[30.6001×(m+1)]+Day+UT/24-679019

其中:

       如果M≤2 ,则y=Year-1,m=Mouth+12

       如果M>2 ,则y=Year,m=Mouth

       UT表示世界时

3.转换程序代码

简化儒略日到通用时

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

bool MJDTime2CommTime(const MJDTIME MJD, COMMONTIME*Common)

{

    int a, b, c, d, e = 0;

    double UTDay = 0;

    double UT = 0;

    a = (int)(MJD.Days+MJD.FracDay + 2400000.5+0.5);

    b = a + 1537;

    c = (int)((1.0*b - 122.1) / (365.25));

    d = (int)(365.25*c);

    e = (int)((b - d)*1.0 / 30.6001);

    UTDay = b - d - (int)(30.6001*e) + FRAC(MJD.Days + MJD.FracDay + 2400000.5 + 0.5);

    Common->Day = (int)(UTDay);

    Common->Month = e - 1 - 12 * (int)(e*1.0 / 14);

    Common->Year = c - 4715 - (int)((7 + Common->Month)*1.0 / 10.0);

    UT = (FRAC(UTDay) * 24.0);

    Common->Hour = int(MJD.FracDay * 24);

    Common->Minute = int((MJD.FracDay * 24 - Common->Hour) * 60);

    Common->Second = MJD.FracDay * 24 * 3600 - Common->Hour * 3600 - Common->Minute * 60;

    return true;

}

通用时到简化儒略日

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

bool CommonTime2MJDTime(const COMMONTIME Common, MJDTIME*MJD)

{

    int y, m = 0;

    double JD, UT = 0;

    JDTIME  jd;

 

    if (Common.Month<=2)

    {

        y = Common.Year - 1;

        m = Common.Month + 12;

    }

    if (Common.Month>2)

    {

        y = Common.Year;

        m = Common.Month;

    }

    UT = Common.Hour + Common.Minute / 60.0 + Common.Second / 3600.0;

    JD = (int)(365.25*y) + (int)(30.6001*(m + 1)) + Common.Day + UT / 24.0 + 1720981.5;

    MJD->Days = (int)(365.25*y) + (int)(30.6001*(m + 1)) + Common.Day + UT / 24.0 + 1720981.5-2400000.5;

    MJD->FracDay = (UT / 24.0 ) - (int)(UT / 24.0 );

 

    return true;

}

 

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值