你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

GPS,UTC和本地时间的显示器

[复制链接]
XinLiYF 发布时间:2018-3-7 20:34
GPS,UTC和本地时间的显示器
6 H: S1 f$ `" |' S) E* h8 V
5 X7 k/ b. f2 ]2 d
转载来源:GPS,UTC和本地时间的显示器
$ @4 A5 H+ b* X0 g1 t
# N- V: o6 j7 Y& e$ W4 TGitHub仓库:http://github.com/XinLiGitHub/GpsUtcAndLocalTime
) [# ^/ x+ k0 B1 ePS:博文不再更新,后续更新会在GitHub仓库进行。1 T8 s) ?! c) m8 q5 r6 w

. c0 N& W% h$ e2 z- W/ d! x      GPS,UTC和本地时间的显示器。程序中涉及到朱利安日期的转换,详细介绍见维基百科[Julian day](http://en.wikipedia.org/wiki/Julian_day)。9 }! }! n" j0 K$ e0 R& {1 v: K

1 I- H3 W5 L' p$ B9 J1,开发环境1 ?( Q+ n5 V4 B7 |
      1,操作系统:Windows 10 专业版
5 n  E& H+ C8 \- _      2,IDE:Visual Studio 2015 专业版
3 P1 p& D# l6 H$ C% C: k# Z2 X9 G  V' G2 @, Z
2,程序源码
, v: x7 ]+ V; l: ?# }6 P      DateTime.h文件6 U4 B6 d0 `# z* j! h5 H
+ P5 _! Y5 X; W) t
  1. /****************************************************************
    ; ^5 ?$ M) Y# {4 g4 R
  2. * Copyright (C) 2017, XinLi, all right reserved.
    " @- b% W4 ]! z( i! c8 G
  3. * File name:    DateTime.h
    & F0 t0 e, I' s2 b
  4. * Date:         2017.10.17) M2 |+ R/ _' Q. b- a0 B  s; p
  5. * Description:  Date and time module header file.
    6 G( b% R& f( [9 a
  6. *****************************************************************/. T! J, ~& O( G0 q

  7. / |4 b( m) x  b2 M4 _
  8. #ifndef __DATETIME_H
    - c4 V/ b" H) {" O; w" O7 U* k  K4 j; ^
  9. #define __DATETIME_H
    ( @6 n# _+ ^* E7 w+ g' P$ l

  10. 5 _4 [2 Z" T  j  g5 x/ x' c! g
  11. /****************************************************************
    $ X( M8 m1 M  i+ U7 o
  12. *                        Header include1 |! k1 \8 [( h
  13. *****************************************************************/; x+ |% E# h; c

  14. # C8 `) s8 V3 G6 e- I7 _

  15. $ t2 }" ~0 [! _) e
  16. /****************************************************************  a7 i; n. j: }* L
  17. *                       Macro definition8 z6 H' A$ m" u, m9 n
  18. *****************************************************************/
    4 W2 Q" a4 W2 `, g: {! B& I. v

  19. & k* g& i& r9 T8 S  y3 J% W+ _1 X

  20. ! |3 V+ S1 Y! X; O
  21. /****************************************************************
    * B1 b4 d6 E) c) {
  22. *                       Type definition: o( ?2 D) U% I* B
  23. *****************************************************************/0 x; g0 F2 X6 w; |9 j, q
  24. - \2 u! {$ j$ ^* S
  25. 1 u4 p$ w4 c9 m
  26. /****************************************************************& H. d( S3 o3 n4 M  s; `" Y
  27. *                     Structure definition' l! j! x; z; A2 W
  28. *****************************************************************/: ?8 q5 c% H+ J3 O
  29. typedef struct1 k0 A. Q/ ?5 q4 b' y! y% r9 J5 c7 r
  30. {
    - M5 \1 G( `% u) s4 g) c6 k
  31.   int year;9 b2 c- ?$ ~  o) d+ T
  32.   int month;
    ) ~0 V5 H: P' N) i& Q3 T" ?1 t# f  T
  33.   int day;
    1 R- Y8 M" N' O" {
  34.   int hour;
    : u- W3 }8 k7 l2 J
  35.   int minute;1 E0 i" n9 i2 s* Y
  36.   int second;8 K- ?% b! j! E3 ?$ x! p6 _5 i
  37. }DateTime;
    . U7 a. R2 h. r+ N4 ?
  38. + Y  M, ^6 I/ |- I" ?3 H. p
  39. typedef struct( |0 U/ M$ Y- d: T2 {- J
  40. {
      i' g! [% L# ?; O4 ]/ z3 j; k$ O
  41.   int week;% v( U& l; s3 U2 y6 O, C) x, O  i& j
  42.   int second;2 P( o6 w9 }) R# V% C7 D
  43. }GpsWeekSecond;% ?5 |" e0 T+ c3 C8 m. y! q* H
  44. - Y5 i1 A, f. E! @* i8 a' y8 p
  45. 8 O7 ~3 C9 v$ a: z
  46. #ifdef __cplusplus% l3 G/ P5 l5 p  f1 U
  47. extern "C" {
    6 M$ y: d. m3 b! b; @0 T, A
  48. #endif  /* __cplusplus */
    2 _5 _1 J: z2 W
  49. 6 u& ]- a8 Y% ]9 X
  50. /****************************************************************" O) s2 _7 Q2 T4 ]( H; k
  51. *                     Variable declaration2 a# q' t* G6 m  M2 L
  52. *****************************************************************/: U# k* V% t$ E- Q6 M

  53. * B( f) q4 W$ j" U+ Q  H0 B

  54. 5 i( I: W( `# s
  55. /****************************************************************8 J  B! t" g2 }, x9 V
  56. *                     Function declaration7 t# @- s. O, M5 B5 O8 o0 v6 i' F
  57. *****************************************************************/
    # `2 Z/ [: s5 l/ ^) v- G
  58. DateTime GregorianCalendarDateAddYear(DateTime time, int year);, F  s. t  ~5 u6 O6 c
  59. DateTime GregorianCalendarDateAddMonth(DateTime time, int month);
    $ @% \: y1 \: S' C* x' l
  60. DateTime GregorianCalendarDateAddWeek(DateTime time, int week);' i9 U' w) \( F& f+ Y
  61. DateTime GregorianCalendarDateAddDay(DateTime time, int day);. y9 b$ Z1 ~' x
  62. DateTime GregorianCalendarDateAddHour(DateTime time, int hour);! E& ]8 _. |4 \9 ~/ @
  63. DateTime GregorianCalendarDateAddMinute(DateTime time, int minute);
    . W# i0 |; g3 Q  _- ], ~
  64. DateTime GregorianCalendarDateAddSecond(DateTime time, int second);9 B. U0 ^8 E+ {# U5 D# Q
  65. GpsWeekSecond GregorianCalendarDateToGpsWeekSecond(DateTime time);
    ! Y0 P) K8 L% d
  66. double GregorianCalendarDateToJulianDate(DateTime time);8 m1 w. |1 q% ^
  67. double GregorianCalendarDateToModifiedJulianDate(DateTime time);6 w" Q" N6 F. X
  68. GpsWeekSecond GpsWeekSecondAddYear(GpsWeekSecond time, int year);% a/ T, |1 q* O! K
  69. GpsWeekSecond GpsWeekSecondAddMonth(GpsWeekSecond time, int month);
    * ?# l0 M7 T$ K9 @
  70. GpsWeekSecond GpsWeekSecondAddWeek(GpsWeekSecond time, int week);
    3 q5 R) r2 N7 [0 ~/ |" E' V
  71. GpsWeekSecond GpsWeekSecondAddDay(GpsWeekSecond time, int day);, G) ?4 V: ^0 d2 ]7 F' ~  b1 l4 z
  72. GpsWeekSecond GpsWeekSecondAddHour(GpsWeekSecond time, int hour);
    * r" J! G& L' `
  73. GpsWeekSecond GpsWeekSecondAddMinute(GpsWeekSecond time, int minute);3 ?6 D$ `* h, M9 Z7 v% E
  74. GpsWeekSecond GpsWeekSecondAddSecond(GpsWeekSecond time, int second);. N4 ~9 ^; |$ b. d* C$ A' k' ~
  75. DateTime GpsWeekSecondToGregorianCalendarDate(GpsWeekSecond time);( X& k; \3 P* M' V+ L8 f
  76. double GpsWeekSecondToJulianDate(GpsWeekSecond time);
    - i% H, C( I! s( S6 A
  77. double GpsWeekSecondToModifiedJulianDate(GpsWeekSecond time);8 L. ]' ~* g' F3 ~( w. n+ W, ]
  78. double JulianDateAddYear(double jd, int year);
    4 g9 y) e0 z, J1 \' ]$ ?
  79. double JulianDateAddMonth(double jd, int month);3 N: o! \' [& i9 `1 ?( @& m
  80. double JulianDateAddWeek(double jd, int week);
    * v0 c/ i( n4 |3 ]1 J( g
  81. double JulianDateAddDay(double jd, int day);; O9 o6 V8 Y% P" U( Z9 k
  82. double JulianDateAddHour(double jd, int hour);
      W* q5 a$ L& N0 _1 U$ M# ]
  83. double JulianDateAddMinute(double jd, int minute);
    . w% _  v/ W! R6 R; }
  84. double JulianDateAddSecond(double jd, int second);. @, a8 r. C, e, e% B$ G( Q
  85. DateTime JulianDateToGregorianCalendarDate(double jd);+ d, Q) q+ J. t2 M# q" u2 P# D6 v
  86. GpsWeekSecond JulianDateToGpsWeekSecond(double jd);
    0 D; [$ w% R" r, _8 [9 E7 s0 d! e
  87. double JulianDateToModifiedJulianDate(double jd);2 p- L' [* I1 @  d4 Q
  88. double ModifiedJulianDateAddYear(double mjd, int year);
    0 r$ ~! Z! O; A
  89. double ModifiedJulianDateAddMonth(double mjd, int month);
    ' Y  _3 I! y+ C$ ^. k8 O
  90. double ModifiedJulianDateAddWeek(double mjd, int week);
    ; n' ]  x/ D9 f& u$ Y
  91. double ModifiedJulianDateAddDay(double mjd, int day);
    / S  o0 h1 s( Z. a# S3 g) \
  92. double ModifiedJulianDateAddHour(double mjd, int hour);1 D5 r& e' i+ y3 P4 r
  93. double ModifiedJulianDateAddMinute(double mjd, int minute);
    ( E- I4 x; N$ N* o
  94. double ModifiedJulianDateAddSecond(double mjd, int second);
    7 d# q8 n4 q% t' E' e) A1 y$ h
  95. DateTime ModifiedJulianDateToGregorianCalendarDate(double mjd);
    : c, g: F9 u% J) \8 O
  96. GpsWeekSecond ModifiedJulianDateToGpsWeekSecond(double mjd);- u9 N& g* q3 V' j, o5 {0 U0 p) C
  97. double ModifiedJulianDateToJulianDate(double mjd);
    * {9 T& H" A/ f# }2 B6 k
  98. ( U+ r" L# M  {* t: i6 b& a  B
  99. #ifdef __cplusplus5 p  f) k* D# g
  100. }
    / C) y; p/ V; k  g
  101. #endif  /* __cplusplus */( u' s! p+ @" R" m# g7 O! s

  102. 3 r1 E6 ^8 y! B
  103. #endif  /* __DATETIME_H */0 T1 d9 Q" q' N% d- W' I. A  @5 M
复制代码

5 k- b. n4 T  a4 n; I( V  W% C- Q& g7 Y      DateTime.c文件, r' u; K0 f8 K2 v  J8 B. W
  1. /****************************************************************
    5 ]# h: Z% Q7 q. E9 {) _" a; s
  2. * Copyright (C) 2017, XinLi, all right reserved.
    2 f. B& t$ G$ N; K0 R! j- ]
  3. * File name:    DateTime.c
    6 ~4 L" q) [, p- ]* n0 i
  4. * Date:         2017.10.17& _5 R# m  m" }4 d/ s
  5. * Description:  Date and time module source file.
    " n' b4 j  |: Q/ J
  6. *****************************************************************/
    $ K5 u, S; |! K( N6 h

  7. 4 ]+ H8 b  U* q3 D% b3 G* q
  8. /****************************************************************
    6 k7 w: J% Q7 b# ^5 ]1 J
  9. *                        Header include" v5 I- J9 C' _1 h! L4 W: ^
  10. *****************************************************************/! ^  x. k; F: S. Y
  11. #include "DateTime.h"
    # b3 B; F' R. P% H

  12. 8 Q2 }5 C# n+ N# h; l$ r( m2 w
  13. /****************************************************************
    & j4 B( g- @2 _& x8 O* K
  14. *                       Global variables
    4 A- J, c  }4 o0 a" M# l
  15. *****************************************************************/+ J# O1 K9 m" u# ~
  16. & l  R8 H$ c4 V) N: ]4 U
  17. ! k' n$ @& c2 B. r2 K& t
  18. /****************************************************************
    / K' |. o- _9 E# t5 }& y/ F9 L
  19. *                     Function declaration* L( ?# B: L/ l
  20. *****************************************************************/: H1 K) X. q0 C* {9 B$ a5 l) b

  21. % |4 t# L9 {# d  r
  22. & g; E4 ~5 ?5 V# ]7 r
  23. /****************************************************************
    - L- _+ S" C$ A. x" L4 y: F) G) V
  24. *                     Function definition( c& _. G& ~# e; X& P
  25. *****************************************************************/
    ! n0 H' R& i6 ^: Z) x
  26. , s" K+ N+ X* U
  27. /****************************************************************. r3 i5 ?  ], f; ^
  28. * Function:    GregorianCalendarDateAddYear
    + @4 q! W. L/ s( h: z' m
  29. * Description: Gregorian calendar date add year.# Q* v* Y9 J1 b; M  _& o7 |: u
  30. * Input:       time: Gregorian calendar date.
      E. r! A) U3 N; ^
  31. *              year: The number of year to add.
    0 L1 i" v) a" x4 z" P2 m
  32. * Output:+ k! b' s$ Z! k& ?
  33. * Return:      Gregorian calendar date.
    : X# N2 |0 u) I4 N/ \5 z2 F. t% r
  34. *****************************************************************/
    2 d/ y% l& I. @3 e" {
  35. DateTime GregorianCalendarDateAddYear(DateTime time, int year)5 b) }) R) \& Y" @. P- {
  36. {
    $ D% z$ P8 |2 ~- d8 l
  37.   time.year += year;
    0 n0 U4 A/ s- l# L! k: b
  38. 9 w6 Q, i- k! E- B* n! S- x4 N$ z# y
  39.   if(time.month == 2)8 ~. j& K9 b. O; J, @% `
  40.   {& E4 P; X  z3 d/ M
  41.     int mday = 0;# c# }: W2 x0 N# y3 Y
  42. 6 I% j4 x% o9 X9 Z, I4 l
  43.     if((((time.year % 4) == 0) && ((time.year % 100) != 0)) || ((time.year % 400) == 0))
    $ Z$ L( ]& }; B( \0 W, ]/ ~# O
  44.     {$ h: C' A$ u' ?
  45.       mday = 29;
    3 v6 `4 P! s5 {, R
  46.     }
    / G) |# D% ]. O7 N. D' ~! }+ I- m
  47.     else& j- |9 B- q2 J, U9 U4 ~; F. C; S
  48.     {( Q; S, b: }0 V3 b% w9 ~
  49.       mday = 28;
    3 P. y& ?. [& O* ~- n% N6 R
  50.     }
    ( }- }7 d. V+ p# R

  51. 8 A2 ~5 W, R6 q$ c  x
  52.     if(time.day > mday)" \0 r8 Z' G9 M- e6 U
  53.     {
    % W! p3 l- I. t; g8 X( c6 u
  54.       time.month += 1;
    4 n! j  Z$ F( |1 Y: t0 |
  55.       time.day   -= mday;! |! Q* H( a( p) B& f* k3 _
  56.     }
    . \  Z( k9 U4 q# _& o2 f! Z( H% s
  57.   }
    & z6 I* a6 ]5 r

  58. 7 a, B+ y+ Q/ V& I2 w
  59.   return time;; ^% Y3 K' L- F; F: V
  60. }
    5 A+ `' Y, i: k) ?5 m2 F

  61. 7 R0 g$ m7 Z/ D5 C
  62. /****************************************************************- `. O' h' j6 \1 U0 h2 T, ]" o
  63. * Function:    GregorianCalendarDateAddMonth
    , a; U6 r+ J% s* q" A
  64. * Description: Gregorian calendar date add month.; q1 ]0 A! p; ?' w  B4 [- }3 z: H+ M
  65. * Input:       time:  Gregorian calendar date.
    ' O, g, W% v/ J/ V) w; n3 Y
  66. *              month: The number of month to add.
    ! {) R) W7 o+ M4 D2 y/ A8 p" A
  67. * Output:
    2 Z/ B9 x5 j# p" E, A" _2 \9 g
  68. * Return:      Gregorian calendar date.
    & C5 P2 b1 P" K" T- W+ X
  69. *****************************************************************/, a# q( J$ `5 k/ J% l4 k8 F2 @, u
  70. DateTime GregorianCalendarDateAddMonth(DateTime time, int month)( f" h- {0 [4 g* n
  71. {' z4 w9 A9 ~3 I4 y9 s0 M
  72.   time.year  += month / 12;+ a7 a' w) y5 s  d/ ^
  73.   time.month += month % 12;
    6 j" N9 a6 p' D) q: p' L! |+ r

  74. 4 f0 m! o$ I" d9 q
  75.   if(time.month > 12)
    . r0 \" c! W8 {, i5 F* }
  76.   {( Y- |: k; X( _6 l) m  M; J, B
  77.     time.year  += 1;
    1 j1 W1 l' g: n6 ]
  78.     time.month -= 12;
    ; Q  b8 l. R& D9 U* w
  79.   }/ C: @! E& s- Q$ O4 l9 v7 W: L. r
  80. 8 J- u! \, i  D8 e) T9 D# E% i( ?
  81.   int mday = 0;
    * t5 a& I0 }* r: M

  82. ' r$ a1 d( e" I# B" C
  83.   if((time.month == 1) || (time.month == 3) || (time.month == 5) || (time.month == 7) ||7 i5 |* y* F2 `! D( u* ]
  84.      (time.month == 8) || (time.month == 10) || (time.month == 12))% u9 k" i' S) e5 @5 _0 `* L. D
  85.   {
    6 Z* ^" o! x& O9 r
  86.     mday = 31;& _' Y" e& O+ X! E
  87.   }
    / [+ ?/ b2 F. f' [: J
  88.   else if((time.month == 4) || (time.month == 6) || (time.month == 9) || (time.month == 11))
    . O4 R3 Z& Q' X/ X
  89.   {
    $ [1 j, b; }- |2 N! Q  L( ]4 ~3 a4 V
  90.     mday = 30;
    1 d# X: Z( u! U, E  W6 L$ M
  91.   }
    - x3 F4 \2 {2 c! O0 {
  92.   else3 }4 v! K) ^, G2 _7 F/ z( h
  93.   {
    1 O7 u1 `8 ~' j2 b
  94.     if((((time.year % 4) == 0) && ((time.year % 100) != 0)) || ((time.year % 400) == 0))
    1 k" `* N4 b2 C" `
  95.     {( @$ [5 z: \7 s8 |3 y1 P
  96.       mday = 29;: i+ x. Q3 F' k5 u
  97.     }
    9 z, ^$ S: G# }  R7 B
  98.     else
    / @+ b3 ?% c: {2 i$ K9 n% M( ^+ H% [
  99.     {1 [  p' i" _0 \- c
  100.       mday = 28;& p' x0 w. }! g, @& r4 a" M% O6 _
  101.     }7 O/ N% R# a; Z  P* U% T3 a
  102.   }) F' l4 x/ ]' p3 j! A' J
  103. 6 a" B; C/ g* \
  104.   if(time.day > mday)
    . L  C9 a, G4 B/ }& v
  105.   {
    2 P" c! J( @% Y
  106.     time.month += 1;
    * u# |; ]! {$ O. j% }# @6 a
  107.     time.day   -= mday;
      B( w8 x# _' q
  108. 4 \9 I& ^0 \. I( V
  109.     if(time.month > 12)3 g$ |9 S  M. x% c0 x
  110.     {8 }8 d2 Z; B: i* V- h
  111.       time.year  += 1;
    6 l1 W" C' F& _3 F  L
  112.       time.month -= 12;
    ( Y7 i1 i9 {6 W4 `
  113.     }
    . M* x" s7 L6 Q6 T
  114.   }
    ( P- c$ h5 J5 M/ j
  115. + _: {6 b$ D! G
  116.   return time;
    2 x3 F) ]2 C; w( R
  117. }
    8 C* B) J: F3 G/ g9 i6 {& ~' `

  118. " i/ ^+ @% h! M% {9 y; q" @) T" d
  119. /****************************************************************$ U9 I5 r  ~% X
  120. * Function:    GregorianCalendarDateAddWeek
    ; R7 n% t) p. w3 w9 K7 R& D
  121. * Description: Gregorian calendar date add week.6 n+ d2 m: B7 i! C8 g
  122. * Input:       time: Gregorian calendar date.
    3 p) |+ I7 h+ W6 \
  123. *              week: The number of week to add.
    $ b& q7 U* Z! |$ s
  124. * Output:
    + h, z5 l3 ^" }. A) O8 c% ^
  125. * Return:      Gregorian calendar date.  }  T0 L* d' b$ `
  126. *****************************************************************/  D3 I2 d) H* F' `4 B! Q; a7 S7 V
  127. DateTime GregorianCalendarDateAddWeek(DateTime time, int week)
    * T! U  i! P) k1 v7 O
  128. {; ?, e1 I1 \+ ]% I2 N9 A/ m
  129.   double jd = GregorianCalendarDateToJulianDate(time) + week * 7.0;
    / e9 A2 V+ v* R/ h7 ~, P# m! r
  130. + F; X. i1 j! e. ~4 G
  131.   return JulianDateToGregorianCalendarDate(jd);' z/ h# Q1 H: b% c
  132. }1 n4 l, I: Y& B

  133. + O$ l4 I: b, T/ X
  134. /****************************************************************7 C3 v  u$ _& E5 s& A
  135. * Function:    GregorianCalendarDateAddDay/ A7 t- ~  f( i7 j
  136. * Description: Gregorian calendar date add day.
    0 V" n3 y! @% Q; Y# o9 P! A, U
  137. * Input:       time: Gregorian calendar date.9 x* i4 D' ^4 ~& J% ^" \$ X& c
  138. *              day:  The number of day to add.
    1 ]$ C# ^8 ?. H' u' K6 |
  139. * Output:, }# a4 q$ N( B9 I, }' i
  140. * Return:      Gregorian calendar date.
    1 l7 w9 L; M6 @4 C
  141. *****************************************************************/
      ?3 ]: k4 v$ F' W! b! h) q% j4 p
  142. DateTime GregorianCalendarDateAddDay(DateTime time, int day)" G5 W+ q4 b- m( u; s4 r) @
  143. {
    2 T& ?: {: i" S" @" D, O% h1 f. ^
  144.   double jd = GregorianCalendarDateToJulianDate(time) + day;* k& W& k2 J: }& d9 {2 a" V. Q$ a# N
  145. 1 R* I, z' C) q- s0 c3 R& H
  146.   return JulianDateToGregorianCalendarDate(jd);$ A- ?& k+ m( R% q
  147. }
    9 T' d  b/ a; t! I

  148. 4 k) j7 r7 ]/ W' ]  |
  149. /****************************************************************4 z7 g4 v4 F4 i2 E. x. u
  150. * Function:    GregorianCalendarDateAddHour- H0 E* H1 O6 m7 r
  151. * Description: Gregorian calendar date add hour.
    # [- P  l9 X0 M$ ^8 [; Z: q
  152. * Input:       time: Gregorian calendar date.
    1 {  o# P( |7 P  y1 \8 _
  153. *              hour: The number of hour to add.
    9 [" V  y8 P  t' E% H* x8 S
  154. * Output:6 J5 V1 C$ B6 Y4 P9 B. k
  155. * Return:      Gregorian calendar date.6 a0 i' D3 }( ^
  156. *****************************************************************/
    ' j; y! b' \* l  x: ~
  157. DateTime GregorianCalendarDateAddHour(DateTime time, int hour)' i+ P; P, U3 Y) s- ~4 x
  158. {, j, k7 R5 ?5 L/ R0 J. }
  159.   time.hour += hour;
    4 T; b7 s& _9 q, C, v* v0 Q

  160. 0 x" M, T7 ?+ N. f+ R0 ~
  161.   double jd = GregorianCalendarDateToJulianDate(time);' x  b4 j" i+ b
  162. # |+ g# j9 \" L% d' V
  163.   return JulianDateToGregorianCalendarDate(jd);
    6 l; v5 C; s' ?1 u
  164. }
    ! H; ^9 P8 S# _$ P" U
  165. / V( V7 a% u4 _3 w$ m
  166. /****************************************************************
    : _  Z% E/ p% W5 |; ^( [2 \
  167. * Function:    GregorianCalendarDateAddMinute
    1 p& ~9 K( s7 h0 n
  168. * Description: Gregorian calendar date add minute.$ ~8 b0 j2 {5 Q" V6 y& y9 ?& }7 }. l
  169. * Input:       time:   Gregorian calendar date.: S  K+ b- A- P0 h7 W5 O$ o6 w
  170. *              minute: The number of minute to add.+ N6 x: P- o/ o& Z2 i
  171. * Output:
    6 d/ |; o/ P9 y! P# B# s; u
  172. * Return:      Gregorian calendar date.6 e* J/ D: o9 ?# O7 |9 I( Z
  173. *****************************************************************/4 s) ~1 E5 l% T' Z0 K' X+ D
  174. DateTime GregorianCalendarDateAddMinute(DateTime time, int minute)% C- O9 ^! v) }7 S3 e
  175. {" R) M- w% v- j; c% A( c3 _
  176.   time.minute += minute;0 O: \/ O' H. D& }
  177. 7 c, [: _2 f3 |# ^
  178.   double jd = GregorianCalendarDateToJulianDate(time);8 E* }- Z* |0 I

  179. ; v4 h9 a; U- m% n& i6 G" d8 Y7 O
  180.   return JulianDateToGregorianCalendarDate(jd);: c9 l7 Z# M) F8 k8 }5 X# {+ B
  181. }: B* S$ ~9 U8 X- G: V
  182. : X1 p9 e9 r, p
  183. /****************************************************************
    ' b& |3 g1 J1 e4 K) I. `2 `
  184. * Function:    GregorianCalendarDateAddSecond3 ~! V; K) r% ^+ S
  185. * Description: Gregorian calendar date add second.
    & s/ \6 j4 @6 z0 v( c
  186. * Input:       time:   Gregorian calendar date.
    : p/ x  X8 Y  C
  187. *              second: The number of seconds to add.
      U0 C8 I! w% v) ?; }7 O5 p. l+ k& H5 @
  188. * Output:
    2 `! u6 T* f6 a: W6 a
  189. * Return:      Gregorian calendar date.) p  ~2 H4 B  {" u& F  x) @8 M
  190. *****************************************************************/' ]& S2 M. }& A
  191. DateTime GregorianCalendarDateAddSecond(DateTime time, int second)4 X* M2 U: Y* S* N/ z
  192. {' b3 K! ~2 H! u* v
  193.   time.second += second;
    8 ~0 c7 {, @9 L9 v# K

  194. - _% T# o2 f& }0 j( }
  195.   double jd = GregorianCalendarDateToJulianDate(time);" y% H9 M. X0 [9 x1 ~- j" j

  196. 8 e, B7 V9 {% a! X
  197.   return JulianDateToGregorianCalendarDate(jd);6 @  P7 _' x5 D& s5 w
  198. }
    , B: @( T  z$ V+ t

  199. 0 q5 C  A4 d0 V8 ?2 r3 k
  200. /****************************************************************
    ; J" X" ^, `- Y) {8 C1 i
  201. * Function:    GregorianCalendarDateToGpsWeekSecond7 b  c) F  I5 `; P
  202. * Description: Gregorian calendar date to gps week and second.$ o  [( C3 f; c
  203. * Input:       time: Gregorian calendar date.
    8 F/ q& K' t) q; E
  204. * Output:
    * C: l9 a. d/ n: a8 ?
  205. * Return:      Gps week and second.& G! O2 Y$ u& J! d+ Y, `7 O
  206. *****************************************************************/7 K2 q) K3 @, L) S, f% M1 z
  207. GpsWeekSecond GregorianCalendarDateToGpsWeekSecond(DateTime time)  h  b- R2 F% @: K& X* k
  208. {
    / v* V& D$ p3 }7 L9 K
  209.   double jd = GregorianCalendarDateToJulianDate(time);/ w$ f% q& M/ ]+ _- f  ^, }7 N6 t
  210. " b& A& v. m7 u, q' U& [! @  j
  211.   return JulianDateToGpsWeekSecond(jd);
    4 y- M# R2 s+ W) ~, x
  212. }
    0 @! M7 F# R/ ^, J) Z, y; f/ d
  213. * b/ G; W5 O3 \$ l+ Z
  214. /****************************************************************
    . P/ Z4 P5 }9 ?
  215. * Function:    GregorianCalendarDateToJulianDate) w: ]! _) U8 o
  216. * Description: Gregorian calendar date to julian date., X) S" K8 @  ?) h
  217. * Input:       time: Gregorian calendar date.
    - @' c  f9 f$ @8 T9 h; y- O
  218. * Output:
    - l3 v# S9 p' _
  219. * Return:      Julian date.
    9 ~6 S  ]: D" ^# g+ p6 |
  220. *****************************************************************/) U6 f7 p9 h! ~4 E
  221. double GregorianCalendarDateToJulianDate(DateTime time)
    1 g6 P* R) o& E5 T1 N9 y( f" e% x
  222. {5 ?* p, _1 }1 I: K
  223.   int jdn = (1461 * (time.year + 4800 + (time.month - 14) / 12)) / 4
    4 V/ j1 n3 e2 j1 v/ M
  224.           + (367 * (time.month - 2 - 12 * ((time.month - 14) / 12))) / 12
    ' `& G6 L% }* x7 C6 P1 j, p
  225.           - (3 * ((time.year + 4900 + (time.month - 14) / 12) / 100)) / 4; n2 `& J' @* M
  226.           + time.day - 32075;1 e; g2 {) B+ ]6 G" D+ L

  227. 1 J  Y# ^. x  E* W' S5 V* U
  228.   double jd = jdn + ((time.hour - 12) * 3600.0 + time.minute * 60.0 + time.second) / 86400.0;  O; z5 n3 c3 T  u9 |
  229. ' s3 P; J  T: W! T4 q8 Z
  230.   return jd;4 Q* E6 w8 E% M: N' K6 t" Z. q. U# g% t+ x
  231. }/ U0 |9 J, b6 @9 w$ O
  232. ' m' L9 h  `+ s
  233. /****************************************************************3 d5 `2 |* c9 Z+ M& ^; g" Z
  234. * Function:    GregorianCalendarDateToModifiedJulianDate
    / D2 ?6 c' Z, u* _7 B8 c
  235. * Description: Gregorian calendar date to modified julian date.4 s! P; \4 T6 x7 k
  236. * Input:       time: Gregorian calendar date.
    $ v* v4 }0 y' K9 r) G
  237. * Output:
    ) l, e- t( @0 c" R+ w
  238. * Return:      Modified julian date.. ?) w8 x  z: C
  239. *****************************************************************/
    5 h4 T  ]7 t+ Z" \0 @9 X6 z: b
  240. double GregorianCalendarDateToModifiedJulianDate(DateTime time)
    1 B: u( q" s' F4 E1 }4 X
  241. {
    8 N& L7 w' G  w' G( p/ M
  242.   return GregorianCalendarDateToJulianDate(time) - 2400000.5;
    ' T/ A& \7 {+ K
  243. }1 I3 a' g0 B$ |" d: @: @3 Z" f- {% P

  244. ; B( M* u) G7 {4 H0 R- W8 j
  245. /****************************************************************# H, V  r3 ?' [* f5 m6 N* a& |
  246. * Function:    GpsWeekSecondAddYear2 f3 o5 r& b3 a, p( r
  247. * Description: Gps week and second add year.
    $ b4 h3 b% l7 T" i
  248. * Input:       time: Gps week and second.
      e1 w  M5 k' C' i0 h4 r# G
  249. *              year: The number of year to add.0 a  ^+ z- ]5 A/ L% b! b
  250. * Output:2 H' t2 t2 w2 T  J' j/ p' n9 L
  251. * Return:      Gps week and second.* d+ s9 q8 _* `, e  n7 C9 H
  252. *****************************************************************/
    " V# O3 ^2 n( C
  253. GpsWeekSecond GpsWeekSecondAddYear(GpsWeekSecond time, int year)
    & @. x" D) [+ Y2 f0 Y' Z( D
  254. {7 e) n! u0 _+ k! A) A$ M7 ^
  255.   DateTime date = GpsWeekSecondToGregorianCalendarDate(time);
    - x6 v9 l9 y* k: J
  256. . x' i* Y( f0 q, v: Q
  257.   date = GregorianCalendarDateAddYear(date, year);2 X( V" Z' O" L, j

  258. " V: _9 G. ]6 |4 p3 p: f
  259.   return GregorianCalendarDateToGpsWeekSecond(date);6 x( G/ @7 s- r. Y5 P) t" z  y
  260. }
    $ L& r- k( h2 ]( D6 F# Q. i" z/ L

  261. $ w/ J) Q& H3 k5 X/ Q0 N2 n1 T6 H
  262. /****************************************************************' j) R; P9 d2 d1 m3 E$ T+ n. ?  b
  263. * Function:    GpsWeekSecondAddMonth
    3 B2 z. ], W. n- O
  264. * Description: Gps week and second add month.
    3 o) S' X- t7 z* P- Q9 f
  265. * Input:       time:  Gps week and second.
    ( c7 H( t! J9 z3 K2 g% S4 r
  266. *              month: The number of month to add.
    + ^3 _/ ^% E. h0 q; z7 K
  267. * Output:
    % J8 ~" x. A# s" U& Z
  268. * Return:      Gps week and second.
    / l4 I3 F% \( R
  269. *****************************************************************/$ h4 u9 V. C5 g. s
  270. GpsWeekSecond GpsWeekSecondAddMonth(GpsWeekSecond time, int month)  \5 O3 i2 W5 ?5 Y4 e
  271. {
    1 D7 K5 M6 i& ]9 x, Z$ T
  272.   DateTime date = GpsWeekSecondToGregorianCalendarDate(time);3 I4 [3 K5 I: T7 B
  273. . H5 L) T0 r: z. `5 ~9 t
  274.   date = GregorianCalendarDateAddMonth(date, month);: R$ I2 S# x; Q4 q% h4 W/ i/ R
  275. 4 W. O3 I0 |4 W7 E$ s) T
  276.   return GregorianCalendarDateToGpsWeekSecond(date);0 f) K- U/ S$ |. W( k
  277. }
    8 @* a5 B2 ?$ D) Z+ @4 o% Y2 D
  278. , A) d. i, O  S
  279. /****************************************************************
    : z# B# u+ P1 A# _0 {
  280. * Function:    GpsWeekSecondAddWeek0 Z" l% K0 [4 j1 p, W
  281. * Description: Gps week and second add week., i$ k  h: V! z7 h
  282. * Input:       time: Gps week and second." m1 ]* L' F: j7 a
  283. *              week: The number of week to add.
    . m: D* M' I; S. D' ~
  284. * Output:8 y# Z3 e( W" }2 O
  285. * Return:      Gps week and second.( p$ y" _$ K/ ]2 N
  286. *****************************************************************/
    , x! l$ i" R& u4 B& p/ T3 G1 {" h' Z# x
  287. GpsWeekSecond GpsWeekSecondAddWeek(GpsWeekSecond time, int week)2 [, K2 R* |1 C7 K; M
  288. {
    + g+ J8 T6 X/ l+ I1 `* R$ a. }
  289.   time.week += week;& H9 T! O% L4 ^4 L0 {

  290. ' K" A2 |' F) d* j, `
  291.   return time;
    ! C% s9 C! r, K4 S% K" h
  292. }
    8 s: R; y. K2 z& G  b: \& j+ s. c
  293. - U1 `. E8 |5 Q) V5 T3 b
  294. /****************************************************************9 A! s: V- t& g, |& x. T- c6 p* n
  295. * Function:    GpsWeekSecondAddDay1 G3 V4 L6 B! Y% h2 u% o
  296. * Description: Gps week and second add day.( k9 k% K: [; H3 r
  297. * Input:       time: Gps week and second.
    1 E& V: x# Z/ }
  298. *              day:  The number of day to add.
    7 W* a) e" ]4 n$ J6 o. ^# z
  299. * Output:0 H, f& B4 r. K4 i3 o
  300. * Return:      Gps week and second.. J! e' W+ S; C$ T" C8 R
  301. *****************************************************************/
    1 X1 R- i# \8 u9 e
  302. GpsWeekSecond GpsWeekSecondAddDay(GpsWeekSecond time, int day): k) ], m# a/ R+ s3 k& w
  303. {3 N9 \( I0 m. D! v  u
  304.   time.week   += day / 7;
    ; Y1 J6 a  p0 I3 A1 t" L4 R* l
  305.   time.second += day % 7 * 86400;( U# @2 d# q0 L1 x0 u, ^" w8 y+ z

  306. : [6 E9 `5 }: \& ^% L) ]5 z
  307.   if(time.second > 604799)
    ( `# _" L6 e2 {0 D2 l$ C* {
  308.   {
    , W) A% X  k: V/ }$ a
  309.     time.week   += 1;0 y; a1 n9 h9 E; w9 F9 c2 f
  310.     time.second -= 604800;
    5 o( n5 f0 E# z# n4 o# x3 t2 }, c+ u3 n
  311.   }* h3 z7 L8 K6 A% _9 ], ~4 p
  312. $ a8 `  _2 h% ]' h
  313.   return time;
    7 z% M  _+ a0 G- W" F, m
  314. }& s, p  K4 v4 n1 ]7 o
  315. 3 O' U' v9 H/ c' W9 A- ?9 Z2 w
  316. /****************************************************************
    * h/ z8 P+ [4 N9 {" F! R# Z; M5 H
  317. * Function:    GpsWeekSecondAddHour/ Q3 T# p/ D6 D2 a/ U1 G/ t
  318. * Description: Gps week and second add hour.
    5 W. Y6 ^* z1 a  V3 E2 H" E2 a; T
  319. * Input:       time: Gps week and second.
    ' z+ X& e2 Z1 m9 j
  320. *              hour: The number of hour to add.
    / z8 U4 w" B* p1 G# S3 F( O) F* \6 b' {
  321. * Output:; \: B) I4 }6 G3 X2 W- [: z
  322. * Return:      Gps week and second.
    9 B% `6 @+ n1 E/ Y6 a" k# ?" O
  323. *****************************************************************/
    8 i5 ^  G4 O+ J# T3 {/ J8 L
  324. GpsWeekSecond GpsWeekSecondAddHour(GpsWeekSecond time, int hour)
    9 F2 \; b# k6 h- e4 R  Q( k
  325. {
    2 N5 }$ b- q+ \2 W( C: J3 G
  326.   time.week   += hour / 168;
      n2 `6 U+ y+ f& Z" R6 B( g
  327.   time.second += hour % 168 * 3600;. S, ?3 _  ^! ?. I5 Z) [1 D
  328. ' g! a, k( U! k/ V, P3 M3 z
  329.   if(time.second > 604799), _) x+ O% i* w3 u1 x
  330.   {
    ; u, @0 j( z4 v* a# X% K
  331.     time.week   += 1;
    4 @, H9 ~+ ]4 e. j& k
  332.     time.second -= 604800;! D2 ?& u2 o% U; e
  333.   }
    ; b: ?- L$ H- v
  334.   
    % ]; u( W3 i$ }4 K
  335.   return time;
    1 Y! y7 H3 I, n7 S
  336. }
    # f& {+ L; l1 T% K, ~

  337. , h& b+ \2 e+ \; E* u8 R( M( o
  338. /****************************************************************
    " `3 S, {5 @7 n7 ^! V- z' C
  339. * Function:    GpsWeekSecondAddMinute/ X& i  Z" D: i# C  S
  340. * Description: Gps week and second add minute.
    - S$ c4 N6 x# w- g# b5 m4 s
  341. * Input:       time:   Gps week and second.
    . J4 d# B( d- C3 A8 P7 G  d3 ]
  342. *              minute: The number of minute to add.$ p0 [/ f3 M) R% k& Y* a
  343. * Output:- A% Q" W0 m2 @
  344. * Return:      Gps week and second.0 Q. u% u# h" N  O0 r: ~
  345. *****************************************************************/* }& p( q9 x( b6 R
  346. GpsWeekSecond GpsWeekSecondAddMinute(GpsWeekSecond time, int minute)4 \# g5 s( L7 I
  347. {
    7 s: ]2 p9 e$ a2 b1 }" o
  348.   time.week   += minute / 10080;
    - E% L& ?) o- H. X& J
  349.   time.second += minute % 10080 * 60;
    6 F% @5 G0 f; i1 B
  350.   ! Z  I/ ]+ B( K* C# ]$ @4 |
  351.   if(time.second > 604799)4 f  a% n: u3 @' f3 a
  352.   {0 b% G9 U8 P2 x* T( u$ \# W
  353.     time.week   += 1;
    / U& e  \9 z) {8 B/ @$ l$ X
  354.     time.second -= 604800;
    ' \1 r/ G# l) N" z3 Z
  355.   }* ~, `! c, I- h* K- X  A- W
  356.   ) W5 J  I% Z3 Z" U* M
  357.   return time;
    4 C% _' N: [# m3 f. k" h! ^
  358. }2 h0 |: ?4 s: R) s3 {' l% I
  359. ! D1 ~7 |5 O& l( \
  360. /****************************************************************
    ( l7 p% Z9 u9 E* L* |
  361. * Function:    GpsWeekSecondAddSecond
    1 `6 ^- _- {6 \+ M) s
  362. * Description: Gps week and second add second.- _7 ^& `" X6 a% f* E
  363. * Input:       time:   Gps week and second.) K( B( P( O% N. P) T
  364. *              second: The number of second to add.
    ( _. y6 Z- }" C" g$ R0 s
  365. * Output:6 P5 d% }1 F+ V- m6 }
  366. * Return:      Gps week and second.5 T2 c# W  B, b+ Y& u$ d
  367. *****************************************************************/
      P' E' Q% P1 S! t5 @
  368. GpsWeekSecond GpsWeekSecondAddSecond(GpsWeekSecond time, int second)! J8 D+ \" g2 L3 ^( X9 f, A" Q
  369. {
    & W2 h+ y% j- c
  370.   time.week   += second / 604800;
    ; s  Q1 K. {7 i* n' R/ u) i8 T
  371.   time.second += second % 604800;
    ' O* I( J5 A8 c5 R: }% w% k* o
  372. ; B" h; p* O5 a: v0 Q9 j/ N% o
  373.   if(time.second > 604799)
    ! Q/ H  j; {) V( w7 l" B$ o
  374.   {
    9 {. `* u4 X, _- E. [# I; b
  375.     time.week   += 1;
    ) \) Z* h: C4 U; Z1 {( _+ S$ n1 |. W
  376.     time.second -= 604800;
    # q" u' C- y( j: P: t6 M9 L
  377.   }
    4 M$ n8 O& Q5 b7 a5 X; z
  378.   
    % f9 n0 T- |& o; R/ g
  379.   return time;4 C7 e" n+ \; r+ c- A" f5 U
  380. }
    * y% K( v( I! M- ~1 `
  381. / y0 r! Z! u7 t1 ^' ~# R0 O, s
  382. /****************************************************************
    6 q5 \0 b8 \* u
  383. * Function:    GpsWeekSecondToGregorianCalendarDate  m! m2 S0 ]4 F
  384. * Description: Gps week and second to gregorian calendar date.
    ; v8 W) ?  c! M( }: a( {
  385. * Input:       time: Gps week and second.
    . c% M) L$ N( k6 ~- j4 R8 s
  386. * Output:2 M! ~  C# ~3 }# P7 G" f
  387. * Return:      Gregorian calendar date.
    , V' p7 x3 F9 D; T8 {
  388. *****************************************************************/* k3 b& E) ~0 E; ]2 g% e
  389. DateTime GpsWeekSecondToGregorianCalendarDate(GpsWeekSecond time)$ D" D" ]& g" {$ n
  390. {) `5 |1 T7 H  {2 K/ k# q/ Q9 h
  391.   double jd = GpsWeekSecondToJulianDate(time);- T) j0 r4 W1 X9 r8 I

  392. 5 k" q+ v! l6 z0 P  W7 x0 w0 U& D8 ~
  393.   return JulianDateToGregorianCalendarDate(jd);
    $ u5 C, q8 m9 Z- k+ G% M
  394. }0 M# V( V* T, s+ p8 Q

  395. * S: G, V; w8 g+ N
  396. /****************************************************************
    ! s2 V& q5 ~* m/ L( E# y+ C
  397. * Function:    GpsWeekSecondToJulianDate
    % }+ h" y$ s' b/ V* G/ B; W" X
  398. * Description: Gps week and second to julian date.( V8 B7 E7 A+ V/ M# ?
  399. * Input:       time: Gps week and second.
    5 f% a) O. A4 @
  400. * Output:
    2 D6 c. u: }6 S* p
  401. * Return:      Julian date.. ]& g# W0 [3 |
  402. *****************************************************************/9 A' @' Z( x" {+ m* j
  403. double GpsWeekSecondToJulianDate(GpsWeekSecond time)
    6 Z2 ^7 p# Z6 M+ O3 P! m. a' U% c
  404. {! g8 F1 D. [6 e. [
  405.   double jd = 2444244.5 + time.week * 7.0 + time.second / 86400.0;  A, |- y7 p  [/ y

  406. ' I1 r) X0 `: d
  407.   return jd;
    + A" ^0 V4 A" O+ M0 e2 P
  408. }0 M- [" m6 z0 r2 j

  409. 7 M3 B, F- l- W( ]$ o
  410. /****************************************************************
    / q+ m1 Z. D& p  p
  411. * Function:    GpsWeekSecondToModifiedJulianDate
    7 G* K+ i; z# m1 U' H" ]. q4 S
  412. * Description: Gps week and second to modified julian date.) T# {$ E. Z! w- p
  413. * Input:       time: Gps week and second.
    & r4 |9 k8 F- s4 o) z" H
  414. * Output:5 @; ]! s$ x0 B7 t  A8 R
  415. * Return:      Modified julian date." T' T% h* M/ U; z7 U9 D
  416. *****************************************************************/
    # l) z, T- W( }. a. P7 `- y# C
  417. double GpsWeekSecondToModifiedJulianDate(GpsWeekSecond time)% h3 z7 u5 C' q% W* W4 t
  418. {
    , _! S- B2 I& C" V: w7 _3 e$ J
  419.   return GpsWeekSecondToJulianDate(time) - 2400000.5;
    ; o, y5 y( e0 o0 I" A4 f
  420. }) J9 o$ f. R  b. c* [- x  `

  421. / R0 e+ K9 l% v+ T
  422. /***************************************************************** z% G5 W7 S3 J4 A  J
  423. * Function:    JulianDateAddYear
    " f7 X; m4 s0 I5 q- i8 a* ]6 S* B' r3 Y
  424. * Description: Julian date add year.* m% \/ h. w% e" ]6 a
  425. * Input:       jd:   Julian date.
      q0 `5 I8 Q8 i  Q, j3 @  F' v1 U' e
  426. *              year: The number of year to add., L8 U* `1 g& D6 n
  427. * Output:
    ' ?* D3 g  h1 m+ ]
  428. * Return:      Julian date., z- [; u) L0 m! g& [
  429. *****************************************************************/
    7 M5 e) [8 i, \
  430. double JulianDateAddYear(double jd, int year)
    ' V" s  P. |2 \" i& }* m( Y% f
  431. {% k& X! m2 O: W3 ~3 i; S3 X7 R( ~( V
  432.   DateTime date = JulianDateToGregorianCalendarDate(jd);% l% {7 K( c9 s3 O( N* C6 M
  433. 6 t1 d7 k6 F6 r, R; ?9 j1 f9 X0 I
  434.   date = GregorianCalendarDateAddYear(date, year);
    8 F; A; L: D. d3 y7 `

  435. $ E7 q, B: B, ^/ P+ F
  436.   return GregorianCalendarDateToJulianDate(date);
    . ~% S3 P& l- M
  437. }3 {. d+ s! _: q( y; ]3 H

  438. * u+ g. n6 W$ S- ^+ T% A
  439. /****************************************************************% }& V2 }6 D4 I; Q# P3 x/ @, o  _
  440. * Function:    JulianDateAddMonth
    . @8 L7 B5 x3 n
  441. * Description: Julian date add month./ {, y# L  s6 q/ e2 R/ e, X
  442. * Input:       jd:    Julian date./ O8 ^! `1 A2 o- g
  443. *              month: The number of month to add.7 X0 K) ^0 Y+ y3 ]/ R: V
  444. * Output:% }5 e0 M9 V9 g- ~
  445. * Return:      Julian date.
    7 j' @( m. Z0 k- Q
  446. *****************************************************************/
    # g) E: ^/ H2 s  i! {
  447. double JulianDateAddMonth(double jd, int month)
    % I7 U) \% R% ?( Z$ q
  448. {
    9 P+ V9 k, R" i% g+ ?: K
  449.   DateTime date = JulianDateToGregorianCalendarDate(jd);
    $ W$ x% v# ?0 v

  450. 2 s$ `9 I( i, z( ^; t$ s5 j/ M# B3 }
  451.   date = GregorianCalendarDateAddMonth(date, month);+ F* P& i7 g& @, b( @. g

  452. : l( L, E4 K- z1 d* Z, @
  453.   return GregorianCalendarDateToJulianDate(date);
    % _/ r3 l% r3 P! J; K
  454. }
    : e! p2 a5 v! t6 U# B1 `' l+ b+ ]
  455. 8 E& r) b6 N' q% c: n! n
  456. /****************************************************************
    5 }& V5 ]) P; c0 s5 z
  457. * Function:    JulianDateAddWeek  J- t6 x, N( D
  458. * Description: Julian date add week.
    9 o5 ]8 t+ L  F3 L  @
  459. * Input:       jd:   Julian date.
    9 M* i. V! O% x) O& ^3 a
  460. *              week: The number of week to add.7 C5 h2 p" y% @% q0 ^
  461. * Output:
    " u1 C+ g. F# M3 e" V3 C
  462. * Return:      Julian date.- J* a6 Q6 n3 v& o! C
  463. *****************************************************************/" y/ Q" n# N9 ^$ ]
  464. double JulianDateAddWeek(double jd, int week)
    + W/ e7 @; v; J. p
  465. {
    2 @- ?: @- p- _) h- _& [
  466.   jd += week * 7.0;
    - n% \0 u3 i" u) s" e9 A( P

  467. * v1 n9 v; x8 o! s+ I& Z/ n: z
  468.   return jd;( I; l3 {0 J9 t& b+ z7 H
  469. }$ r: h" t) M: H) d) t3 Q; y
  470. 0 t/ c! @9 T0 ]$ ?6 Q& W! N# @) M
  471. /****************************************************************8 [& `& k' f. l6 s! `
  472. * Function:    JulianDateAddDay
    5 N$ W, K# Q+ r. V* L2 ~
  473. * Description: Julian date add day.
    6 ^: b5 `  u% Q3 C, S1 d6 c$ O
  474. * Input:       jd:  Julian date.
    * Z6 d6 B4 c8 @
  475. *              day: The number of day to add., U9 ?# T) }! e' W2 {' B
  476. * Output:
    * z2 S$ A+ I& b
  477. * Return:      Julian date.
    4 ], q- f6 h, f  X' x
  478. *****************************************************************/6 ^7 u$ l0 ?" B  k
  479. double JulianDateAddDay(double jd, int day)
    7 W8 I1 j7 K' d) n$ J: y
  480. {
    ; s, |& M2 Y8 g2 T9 d; O
  481.   jd += day;! S. W- ^1 }, X& a
  482. 4 D8 T0 B  W4 a' P& T; Z4 ]9 v
  483.   return jd;
    , O9 T; V  V0 W" t8 b7 l  Z& Z8 E
  484. }4 I0 {7 W$ w# v* v9 N; [( F3 e6 F

  485. / ]- ^" i- N- s! c% w6 p! L
  486. /****************************************************************
    ! _- x; D4 Z& v7 v4 r7 Q
  487. * Function:    JulianDateAddHour
    / y: X# V, {4 ~( l0 Q" H
  488. * Description: Julian date add hour.
    ( E0 @; p& s9 i! k4 `
  489. * Input:       jd:   Julian date.3 y+ L4 J# K2 b7 z  T
  490. *              hour: The number of hour to add.
    & g9 x+ D+ F. e& R# a* H
  491. * Output:# `' |9 n% j' H) d0 d4 @
  492. * Return:      Julian date.
    8 Z9 p0 _$ ]5 [) X' r, c( g5 `
  493. *****************************************************************/
      K) @; N) K! j7 O/ e
  494. double JulianDateAddHour(double jd, int hour)3 B" N; L" V3 p2 |  E$ ?- J
  495. {1 ^1 R- F3 ~' p% k8 @5 c
  496.   jd += hour / 24.0;2 R! T% p8 T" L: j) i- v6 y! Y1 X0 M

  497. 6 Y- B; j) e4 V* F1 V  e- D. r/ D
  498.   return jd;& Y# @1 N: {9 s$ Z
  499. }% H# {0 h9 q* k# {4 W* H3 Y4 q

  500. # \$ F2 y$ |* z- |9 M$ L
  501. /****************************************************************( C" @" z, |9 n5 G' e$ S
  502. * Function:    JulianDateAddMinute7 @" t8 ~& }# i: ]2 ~8 d4 i
  503. * Description: Julian date add minute.3 q3 A$ I8 ?0 Q: N% v+ m
  504. * Input:       jd:     Julian date.' X' y0 o5 s6 J+ ]3 X
  505. *              minute: The number of minute to add.
    ) Y; O, U3 c7 d9 Q
  506. * Output:! ~) [: \4 r! g
  507. * Return:      Julian date." @9 U. z9 `) l- n1 ~
  508. *****************************************************************/1 z; b0 {- B- T, p5 Q9 \
  509. double JulianDateAddMinute(double jd, int minute)
    9 }; X& M  [( x" J3 E- h( H: O
  510. {
    8 E) u3 ^/ ?. r/ V& n. h) Y
  511.   jd += minute / 1440.0;
    5 [/ G) w6 _3 E3 @6 X

  512. 9 B. j$ I& T' I4 G
  513.   return jd;
    2 m+ A0 }( J% I
  514. }
    ) W' e. Q+ i0 n1 ?2 {6 K" `

  515. & R# M) P* t& N3 b
  516. /****************************************************************0 n6 x% |6 Q3 p& w
  517. * Function:    JulianDateAddSecond6 {2 \4 `) U& O9 O1 E
  518. * Description: Julian date add second.
    . u9 ^: q$ m4 Y" o% o; C
  519. * Input:       jd:     Julian date./ X/ b( E" U4 ]7 C: c
  520. *              second: The number of second to add.
    - V, e, `7 J! b. U- p4 d
  521. * Output:2 V7 h% J5 a  k+ T1 @8 R; M7 ^' S5 B' H
  522. * Return:      Julian date.
    " K% H' x( {, Y) f1 j. d3 O
  523. *****************************************************************/2 D5 S# F" w0 y7 {- _
  524. double JulianDateAddSecond(double jd, int second)
    * v$ H( ], N2 q! k2 H( i, V
  525. {7 k* J- _5 G$ L$ C' j5 q8 X6 y
  526.   jd += second / 86400.0;
    " a  G# k& D/ G$ E

  527. $ z, ?. H' e' i. W. ?3 P
  528.   return jd;1 ]1 s) Z- ^) Z( n2 O& Z* G
  529. }
    % P5 M9 l5 X$ q; x

  530. & @) ^# W; C- a
  531. /****************************************************************$ }( P: I2 I( X' }4 m2 C9 g
  532. * Function:    JulianDateToGregorianCalendarDate  @* Z+ t0 [. a/ a: \# Z- ]
  533. * Description: Julian date to gregorian calendar date.
    ! z7 }! h8 R* o/ R
  534. * Input:       jd: Julian date.4 r7 L& b9 Q: n+ Y  `6 F
  535. * Output:! `# f5 Y. r: ?  h4 Y8 x
  536. * Return:      Gregorian calendar date.# [1 i; o3 E+ C8 Z& o4 P" R5 p+ P
  537. *****************************************************************/2 D; M/ Z0 c( r+ x- Z2 f1 b
  538. DateTime JulianDateToGregorianCalendarDate(double jd)
    / v0 K7 a1 H( z" W6 }/ `* I& z; T
  539. {
    + ], q* v* b0 L" U5 a
  540.   int y = 4716;/ V+ N  G. z7 S3 @% c/ O& l
  541.   int j = 1401;. E6 L/ A) J: g$ o0 F
  542.   int m = 2;
    4 {: c$ E, f7 k4 M" p' P
  543.   int n = 12;3 }) b; ~$ D# V9 @0 v
  544.   int r = 4;& J7 O3 k& Z1 o: M: r. W# m
  545.   int p = 1461;
      p+ y' a* B3 q, R& s
  546.   int v = 3;" x) E) \% ]# ?! W, q: T
  547.   int u = 5;
    0 {- ]9 b2 I! R
  548.   int s = 153;
    ( U+ P+ W7 M2 j4 \/ H
  549.   int w = 2;
    % i1 K& N2 X2 U9 ?7 ]: f) z
  550.   int b = 274277;
    4 @" l# A; Z2 r5 N# q
  551.   int c = -38;; f6 m/ Q2 K1 K' o
  552. % R9 P) Q% Q4 C; r
  553.   int jdn = (int)(jd + 0.5);* u; `- Z. F7 K0 ?5 Z
  554.   int f   = jdn + j + (((4 * jdn + b) / 146097) * 3) / 4 + c;
    ( {( k( ~7 _) a, x9 r: [( N6 q
  555.   int e   = r * f + v;1 J. r1 @  E- O
  556.   int g   = (e % p) / r;
    $ w( N3 ]' Q% @1 d; [
  557.   int h   = u * g + w;1 g3 f! F+ p/ F) R, H
  558. $ Q! S: `) W" Q2 }4 N/ d5 q7 \
  559.   DateTime time = {0};2 l* G" `  A) ^+ U4 v' `4 R# b  z

  560. 3 {# o+ F2 Z: q' h# b
  561.   time.day    = (h % s) / u + 1;3 ]( {: G3 M- a! W1 U
  562.   time.month  = (h / s + m) % n + 1;
    : C( n1 t7 N1 D9 i9 x% Y9 D
  563.   time.year   = e / p - y + (n + m - time.month) / n;9 h. V! r# z# ~9 {* A3 a3 l( }
  564.   time.hour   = (int)((jd + 0.5 - jdn) * 86400.5) / 3600;+ _5 L/ }; ?, s# I- }
  565.   time.minute = (int)((jd + 0.5 - jdn) * 86400.5 - time.hour * 3600) / 60;2 \1 g' ]% t/ ~0 x$ }' c% h4 s/ _1 ~9 s
  566.   time.second = (int)((jd + 0.5 - jdn) * 86400.5 - time.hour * 3600 - time.minute * 60);) G' e5 D2 ^! p0 q
  567. " Z  `: O* {6 |' j" Q0 x& i$ S
  568.   return time;
    . Y6 ]: k! L' V8 V- B# A2 D! [
  569. }8 p# R' m) S4 [, ]+ z( z. s
  570. 5 d4 z9 l: A0 T$ C
  571. /****************************************************************3 ^' b, L1 U2 I0 ^1 Y/ V4 d
  572. * Function:    JulianDateToGpsWeekSecond
    ; \1 ^8 O" J* F1 F
  573. * Description: Julian date to gps week and second.
      m, C1 {9 }$ Y0 E5 q  r! j
  574. * Input:       jd: Julian date.
      F' O4 g+ |- q8 P+ B, ?) Z/ M+ |
  575. * Output:! q# {0 b& w" \  l
  576. * Return:      Gps week and second.
    % H" j, _- ~" s8 C* w
  577. *****************************************************************/6 X! s! ?" O6 H6 E5 `4 |; m
  578. GpsWeekSecond JulianDateToGpsWeekSecond(double jd)  p% ], v4 Z& P% K8 }
  579. {
    1 {& n. }# o7 U  W
  580.   GpsWeekSecond time = {0};
    6 V- B3 w4 _9 B& c
  581.   DateTime      date = JulianDateToGregorianCalendarDate(jd);
    " I% P' u1 \1 x! O% g; [
  582. : y& l' T' c2 _" G6 I& M. L& l
  583.   time.week   = (int)(jd - 2444244.5) / 7;
    $ I" `9 Z; k  l  F2 V* O
  584.   time.second = ((int)(jd - 2444244.5) - time.week * 7) * 86400 + date.hour * 3600 + date.minute * 60 + date.second;
    ) H: ]% A( E8 [# }- w
  585. / y9 ?: Q# R! S7 J1 a5 [# W6 p
  586.   return time;
    % V1 l( D) h/ i% m0 h( N
  587. }0 P6 M9 K) ~7 u! @+ C& R3 C

  588. % B( r  C7 b$ X& x9 G4 P, h* O6 ?
  589. /****************************************************************
    : U4 a( r0 m& g$ F3 s" @. {- p/ a( z
  590. * Function:    JulianDateToModifiedJulianDate
    5 D, ^2 E, l- F5 w# P2 H
  591. * Description: Julian date to modified julian date.
    3 u8 D6 C% u' ~- a1 M
  592. * Input:       jd: Julian date." [! R0 V/ z% t
  593. * Output:0 M+ y8 z" w! v! Y* |
  594. * Return:      Modified julian date.
    ( B8 ]8 E4 J; W2 _0 a' d4 T2 u
  595. *****************************************************************/
    ( W/ f8 Y  Q6 z  Y5 w5 D- Q# W1 n
  596. double JulianDateToModifiedJulianDate(double jd). Z+ y7 u9 }, [$ c7 t
  597. {
    ! ~: a, W1 v& f, h  ?3 n1 f: }# r+ ~
  598.   double mjd = jd - 2400000.5;
    1 Q- L3 G5 Q7 I4 d" k8 k

  599. * {6 `; @! D  o/ U
  600.   return mjd;( `8 b  ?. s( I6 d- Q
  601. }
    4 q& q7 _4 u! A* l

  602. " |0 I0 n: C0 z. k( B
  603. /****************************************************************4 I) Z6 g; f- T- z
  604. * Function:    ModifiedJulianDateAddYear
    % Q/ U8 L+ {+ x- ~- ~
  605. * Description: Modified julian date add year." t5 @* |/ c1 c1 [
  606. * Input:       mjd:  Modified julian date.
    $ s. X; O. j1 V" f; i0 L
  607. *              year: The number of year to add.
    * f4 E  }; G2 B4 S: w
  608. * Output:
    ; l+ Q" T3 R! O
  609. * Return:      Modified julian date.2 A# M4 i/ ~# `- F( J
  610. *****************************************************************/% m- G: q+ n* h8 j) ]3 n
  611. double ModifiedJulianDateAddYear(double mjd, int year)  _, t' i- l! L5 M
  612. {/ A' W6 K# C9 H  Y; X# i7 `5 e% d
  613.   DateTime date = ModifiedJulianDateToGregorianCalendarDate(mjd);# u: L  M: h' Z& q& }
  614.   f+ V. n( L1 H- ~4 _: [0 o7 q
  615.   date = GregorianCalendarDateAddYear(date, year);
    , H; }! O7 ]4 t# F8 g8 E5 j0 c, A
  616. * V) r" g- {+ M# o- X
  617.   return GregorianCalendarDateToModifiedJulianDate(date);
    + M/ _+ ^& ?1 a* o' c$ q& y
  618. }% J" O3 @2 J$ j* x1 {. i
  619. * j3 o3 j3 l( c+ q" ~
  620. /****************************************************************
    ) r6 i' o9 _/ |& x9 J9 p: ?8 k, }
  621. * Function:    ModifiedJulianDateAddMonth' ]5 @- M4 h* i2 |& m3 u5 Z0 j
  622. * Description: Modified julian date add month.  ?; V6 m5 r% Z; I+ m
  623. * Input:       mjd:   Modified julian date.
    8 r1 `  Z& [! `2 F0 X0 `
  624. *              month: The number of month to add.
    + I. S+ x; J3 h( g) E
  625. * Output:
    ( I( X8 _6 x% E* N8 l
  626. * Return:      Modified julian date.
    ( _3 E" Y- r) f
  627. *****************************************************************/% v: e0 E& o6 }9 B
  628. double ModifiedJulianDateAddMonth(double mjd, int month)1 [( M6 Z6 i( K/ ~; l
  629. {! }6 b' H( p% n( A  ~+ l& [8 C
  630.   DateTime date = ModifiedJulianDateToGregorianCalendarDate(mjd);
    " T- C/ |! o0 v

  631.   Z) v' q: f4 N1 x: U" r
  632.   date = GregorianCalendarDateAddMonth(date, month);$ {# Z0 N+ ^0 D1 ~2 j: ]
  633. ! W% o1 a  V7 t' o* U& y7 s
  634.   return GregorianCalendarDateToModifiedJulianDate(date);
    ) K4 Z, _6 o9 F' `
  635. }; n' s7 Y0 t8 m9 e" z0 ^
  636. 6 Z- c1 F# ]/ f# [! A* v
  637. /****************************************************************' T1 y! \* h' A/ c2 R* i: ~
  638. * Function:    ModifiedJulianDateAddWeek
    ' C8 L$ `0 U- b9 {- [: ^
  639. * Description: Modified julian date add week.: O# D8 A1 k7 K6 {5 G& A
  640. * Input:       mjd:  Modified julian date.
    * V* _; J& o0 i1 a: _+ s6 {
  641. *              week: The number of week to add.- U* Q, J. D& [" ]
  642. * Output:
    # @  K# t+ N; ?
  643. * Return:      Modified julian date." G4 d, e3 s$ L5 Z+ j
  644. *****************************************************************/$ k( p0 G) q: m# B
  645. double ModifiedJulianDateAddWeek(double mjd, int week)
    $ E4 Y+ f% \/ X" \5 V! K
  646. {
    , ], @7 b1 K7 W& }2 L, F$ @
  647.   mjd += week * 7.0;% R: h1 o1 X: `" w% q0 p
  648. 7 u7 }" {- l" g' I$ v
  649.   return mjd;
    " H, h: `& Q" t( ]/ {: J" z9 y( Z, i6 R
  650. }
    9 x' Y" Y+ f! H( x5 w

  651. ' y5 e0 c1 F( _" n. W% Z
  652. /****************************************************************( i# _2 F4 x+ G  c: V3 ]
  653. * Function:    ModifiedJulianDateAddDay- X' C% F4 M" M' B
  654. * Description: Modified julian date add day.
    " b) J% q) u% V2 Y0 V0 P
  655. * Input:       mjd: Modified julian date.
    1 d1 c8 Y3 M9 G+ f3 h+ F
  656. *              day: The number of day to add.0 u. Y3 @( {1 A% v9 Y
  657. * Output:7 T  L. p( v  a: o8 a
  658. * Return:      Modified julian date.
    0 s! C3 N/ h4 x) s# ]3 i
  659. *****************************************************************/
    ; B) b& I  x/ j. I& G* e% `$ m  ]
  660. double ModifiedJulianDateAddDay(double mjd, int day)
    . F0 Q# X) Q/ M3 K$ F. D
  661. {
    , y2 c% |& ^) T# M9 @/ B1 z
  662.   mjd += day;) U2 W0 j7 W. Z

  663. ; E& D$ K' u7 V4 s- ~( ~$ K/ w$ m
  664.   return mjd;! J0 B, j1 \. ?0 M0 _
  665. }& ?8 A# t, `) e; A( G6 v4 n% l
  666. + c, V3 ?1 a, s
  667. /****************************************************************, e# l: p) _; v4 w1 b, M
  668. * Function:    ModifiedJulianDateAddHour+ O. D+ d9 Z0 ]- ~6 S! I" i1 n) ]
  669. * Description: Modified julian date add hour.
    . U. ?  C! L/ r, H: g7 [
  670. * Input:       mjd:  Modified julian date.5 {* _# n. e) u" n
  671. *              hour: The number of hour to add., r. Z' u6 ~6 A
  672. * Output:. m. ?. f& x' ^& k6 h0 T. g8 ?
  673. * Return:      Modified julian date.# q! j6 g! j! L- P7 `  Z4 ]: n1 P
  674. *****************************************************************/
    4 l+ ~( s1 N' G/ n; V1 ^. \& f$ M
  675. double ModifiedJulianDateAddHour(double mjd, int hour)
    8 V+ Q+ e% P/ Q) x- B, Z
  676. {
      i; o/ E" L- i; ]0 v6 {
  677.   mjd += hour / 24.0;
    ; y5 x/ S; p" m

  678. $ H! u) C2 v  X1 P  z2 L+ m2 H
  679.   return mjd;
    % o3 o. ]! a# p9 _- B
  680. }
    ! K0 h4 M- R8 b, x9 V

  681. 2 T& j* J; f- r0 z5 b3 C
  682. /****************************************************************
    + T+ o& _; D5 l7 s# w
  683. * Function:    ModifiedJulianDateAddMinute
    1 f: A* ^6 |; ~# x- {$ c
  684. * Description: Modified julian date add minute.5 b, c# \$ t. G$ z! l
  685. * Input:       mjd:    Modified julian date.0 I- ~3 ?: Y- s9 [2 {6 o& S9 x
  686. *              minute: The number of minute to add." }" g# c: \7 n8 }. o$ K
  687. * Output:
    ' q  N  X% I3 R( T# v
  688. * Return:      Modified julian date.2 E  x' E: [: a1 h! A
  689. *****************************************************************/
      T( I" ~# l7 M! g
  690. double ModifiedJulianDateAddMinute(double mjd, int minute)
    5 p2 |! d0 s) T! {+ R& ]5 Q
  691. {0 z  K4 Y6 t2 F! p
  692.   mjd += minute / 1440.0;' |5 m3 N* ~% ]  |6 z+ y1 z( |

  693. & p6 M9 ^# @8 ~5 k# _! ?: ~
  694.   return mjd;
    % m3 d+ X) b* g( N
  695. }
    ) \. H" G  O0 J* p. z! Y

  696. . b# z7 y6 W3 C
  697. /****************************************************************
    6 \6 p; e3 z/ U8 Z" R
  698. * Function:    ModifiedJulianDateAddSecond& V% @7 M0 @+ H% E& g, M! m, ^
  699. * Description: Modified julian date add second.; X1 ^5 B$ t  f; a" N6 @
  700. * Input:       mjd:    Modified julian date.: Z# F/ q. _! D) g
  701. *              second: The number of second to add.
    ; c/ d) g; d! U' b8 R" k7 M
  702. * Output:' G9 t3 D1 ]7 F9 [
  703. * Return:      Modified julian date.7 S9 R/ h! B/ m8 ^9 Y3 m/ K+ f
  704. *****************************************************************/6 L" H1 O0 r) W7 Y) c
  705. double ModifiedJulianDateAddSecond(double mjd, int second)
    " _8 W7 u% }+ ^2 R; {! Q% |
  706. {; {% {* D; n2 k
  707.   mjd += second / 86400.0;5 V+ G  K: E) m5 F  F, p* X
  708. + k. T) W7 ]! @2 A8 H) ^; b
  709.   return mjd;- l3 m. s$ p% L8 b# _5 U# l2 E6 u
  710. }3 ?$ q$ D- I$ M& o. Q- |
  711. " ~1 h0 _4 R' R; N* `# |8 l9 D
  712. /****************************************************************- {& [1 _, w- H
  713. * Function:    ModifiedJulianDateToGregorianCalendarDate
    - H" z) W/ Q4 @1 e5 D
  714. * Description: Modified julian date to gregorian calendar date.
    , @, o& S, p: h* q. U
  715. * Input:       mjd: Modified julian date.
    ) m$ U9 @! q/ f8 E5 I9 {
  716. * Output:
    ; s; ?" J( o$ Y
  717. * Return:      Gregorian calendar date.
    + u$ x9 g: i5 [. P% Y
  718. *****************************************************************/
    & f; G5 N! B  r7 m) H, _
  719. DateTime ModifiedJulianDateToGregorianCalendarDate(double mjd)
    7 X4 K8 V, o7 D
  720. {
    * J) R9 r; K) l0 U3 A* t' c
  721.   return JulianDateToGregorianCalendarDate(mjd + 2400000.5);
    ; m3 c  B- H# e' u' C
  722. }
    ; q$ g6 @! n. N; {: a8 o. H! L/ J. R

  723. $ |! t, e0 r( _$ H' B0 s$ l2 G" _
  724. /****************************************************************& C5 Q4 P( m/ c2 Z3 T
  725. * Function:    ModifiedJulianDateToGpsWeekSecond1 O! M: K$ Q% r5 v7 c$ s9 m5 V8 W+ x
  726. * Description: Modified julian date to gps week and second.
    / v& u8 e% q  _5 L
  727. * Input:       mjd: Modified julian date.
    ; s9 |( c* n- U
  728. * Output:! ]2 B  Q* w3 Z1 S8 B/ j
  729. * Return:      Gps week and second., X7 |5 W# w$ x7 w& s& V
  730. *****************************************************************/
    ; {1 n% ?' Q$ ]; E4 ^) w
  731. GpsWeekSecond ModifiedJulianDateToGpsWeekSecond(double mjd)+ L. g' U# z/ f: T8 E
  732. {
    , r: I- j. M2 r2 D' P2 v
  733.   return JulianDateToGpsWeekSecond(mjd + 2400000.5);
    ; K: p. C: J1 \4 h$ J
  734. }
    # x; L- A1 u1 q) Q; u6 \
  735. ! W5 h& a4 V" e$ c6 Z. ?, ?# h$ Z- Y
  736. /****************************************************************
    8 J: _  D8 m0 @- d/ x4 }# q
  737. * Function:    ModifiedJulianDateToJulianDate
    4 A+ \0 N' X% q$ i* @6 Q" q6 p- X
  738. * Description: Modified julian date to julian date.5 J4 V/ ^* r0 M. F$ r$ E: M# F- D
  739. * Input:       mjd: Modified julian date.
    % a& t2 I% d/ f9 p' h! x9 Q! D! C
  740. * Output:$ R5 |4 n/ Z+ `, r+ R4 k
  741. * Return:      Julian date.
    / G) ?! k7 X6 k: e& o  u
  742. *****************************************************************/
    ( ?1 @: g% G0 s* ]" c
  743. double ModifiedJulianDateToJulianDate(double mjd)
    9 @8 h5 Y3 l: h# a; [* i& Z% M9 e
  744. {
    . W4 `2 m4 V8 v. n4 M9 ~
  745.   double jd = mjd + 2400000.5;. `' y- M; f" w- e, |2 D

  746. . V* Y0 e8 W- i: \( ]0 G% e6 I! N
  747.   return jd;
    + B. ?6 |3 }9 G1 o$ k
  748. }
    & x/ C- i$ t. _. t& X' Y! y( T" v
复制代码
8 z5 q$ B/ u- w* f) P
      main.c文件" m0 k+ c) m5 Q, n
  1. /****************************************************************$ l4 g; T& X6 q) Y- Y! {
  2. * Copyright (C) 2017, XinLi, all right reserved.
    2 T/ ?( ^" T- ]; K1 I; ]( e2 h
  3. * File name:    main.c
    3 I: i0 ^$ y4 e4 A5 a
  4. * Date:         2017.10.17) L  {2 D: J' t
  5. * Description:  GPS, UTC and local time displays.
    5 Y9 w* t( z9 c
  6. *****************************************************************/8 T' r0 o5 F0 y2 l. g7 l
  7. * N9 M8 s% s3 x
  8. /****************************************************************7 \; u1 E3 x. q) h; z7 c
  9. *                        Header include
    0 c8 q( z, C" }0 ~0 v- D3 V* U+ e* c
  10. *****************************************************************/
    ; }" y1 t& I+ `
  11. #include "DateTime.h"
    + I3 U4 ~# Y6 o& @7 B
  12. #include <stdint.h>  p, l7 q/ J  Q: U% |7 J+ X$ d- K
  13. #include <stdio.h>
    2 d! s$ m; t! L7 d7 y# r7 z
  14. #include <time.h>5 Z8 _2 d0 ]7 I; A% Y4 w# V3 N3 w$ t
  15. #include <windows.h>
    + g  a! m* n0 Z1 U
  16. 4 H  f5 U" B& M+ L6 s" q* h
  17. /****************************************************************
    ' X8 F6 ?6 F4 g# W$ C- X. f
  18. *                       Global variables5 E0 S& B& B# _3 Q) X+ K5 \8 o7 ?
  19. *****************************************************************/
    6 ~2 X/ y4 D* ^3 r
  20. 1 ]4 R" i% M; I) E. H
  21. / U+ E8 t, Z6 O. f- a! W$ n
  22. /****************************************************************
    ; I: ?# T( [5 |. D) X  p  r0 ]- |
  23. *                     Function declaration
    ! Y# ?) k. k4 X" l: {5 y
  24. *****************************************************************/
    7 B9 L$ N  ~% ~" M& w/ R6 X
  25. static void gotoxy(int x, int y);
    # k7 \& U+ C3 j# P# \4 F& N

  26. * R; O7 s9 v& m% V' i) o6 S  Y/ D
  27. /****************************************************************
    . h5 g2 s# `( n' o5 N
  28. *                     Function definition: Z2 h8 @% J3 f" b' {& j& Z8 v
  29. *****************************************************************/5 z: v  n3 ~) \9 y
  30. + U2 H' w8 p- y1 A3 [; N
  31. /****************************************************************
    + @/ b- A6 C4 K6 G) k  J; g# I
  32. * Function:    main( e" \, k5 L8 N
  33. * Description: Program entry./ ]; c) b% \2 O- d# l/ N0 _" A) Y
  34. * Input:
    9 b  D7 c4 p5 b5 l8 y* C
  35. * Output:, W! X7 {& H/ N) l3 x
  36. * Return:0 \, i/ _5 T' R* e/ Z
  37. *****************************************************************/
    $ ^  i7 M+ f* p3 |2 J- r) U
  38. int main(void)
    $ Z# G  `" Y- v5 K" X
  39. {$ B5 w6 D, D+ b; r0 }
  40.   for(;;)  I5 S4 m/ x7 N1 M% [( \
  41.   {
    7 L3 |+ x, c8 t! b& v
  42.     time_t        times     = 0;9 D4 N' Y% [; d+ L$ V4 d
  43.     double        mjd       = 0.0;7 _; Z8 E1 k/ D" }- f$ t: Z
  44.     DateTime      utctime   = {.year = 1970, .month = 1, .day = 1, .hour = 0, .minute = 0, .second = 0};6 Y. f9 y2 W5 r8 y5 t" y1 w7 q
  45.     DateTime      localtime = {.year = 1970, .month = 1, .day = 1, .hour = 8, .minute = 0, .second = 0};
    & O# ?( @' n, K1 \6 l" s3 }9 q! R
  46.     DateTime      gpstime   = {.year = 1970, .month = 1, .day = 1, .hour = 0, .minute = 0, .second = 0};
    8 j, D( I0 @* O1 B. q
  47.     GpsWeekSecond gpstimews = {0};
    , J& |; R; Z, z! C
  48. ( ~& O3 R% C2 {5 c: C- S3 B" S. e# y
  49.     time(×);
    / y' K* ^2 B' W
  50. ; \) b5 ?# G; H. O  t- V7 @! p
  51.     if(times > INT32_MAX)1 f: _  v7 f& L1 u. t
  52.     {. E# `! u9 M6 e
  53.       utctime = GregorianCalendarDateAddSecond(utctime, INT32_MAX);& e6 u" f9 y/ s5 }6 {# [
  54.       utctime = GregorianCalendarDateAddSecond(utctime, (int)(times - INT32_MAX));
    , _5 Y1 |; X! U4 ]6 d/ K
  55.     }, X9 \( r( @+ f' u; X- D& _
  56.     else
    $ [% d0 m# E9 k/ }
  57.     {
    ) ^8 [3 \7 F: m# i, z( j- E
  58.       utctime = GregorianCalendarDateAddSecond(utctime, (int)times);0 R- G( _) r) o; `9 m
  59.     }
    % |: H% {) q& {% F

  60. * M8 o5 Y9 H. v1 O  W0 B: b
  61.     mjd       = GregorianCalendarDateToModifiedJulianDate(utctime);; l( J$ N" E1 G8 {6 o
  62.     localtime = GregorianCalendarDateAddHour(utctime, 8);, x9 F* ^7 M, d
  63.     gpstime   = GregorianCalendarDateAddSecond(utctime, 18);
    ; v. `. i8 Q2 P/ w" O
  64.     gpstimews = GregorianCalendarDateToGpsWeekSecond(gpstime);5 X( i) h4 G2 f# f: \$ _. {- M
  65. 9 Z& Z5 G% \7 r
  66.     gotoxy(0, 0);
    ( }) q! O, a; o* J9 d# @
  67. $ |, F# w3 @$ v* T1 z
  68.     printf("Local | %d-%.2d-%.2d %.2d:%.2d:%.2d | timezone UTC+8\n",
    : C& o9 V0 Y1 H; U
  69.            localtime.year, localtime.month, localtime.day,: J# k# t7 K. g" y$ D& I5 b- m" j
  70.            localtime.hour, localtime.minute, localtime.second);% n3 D: I' s! R: f) V- n
  71. # ^! y4 t5 \7 J) W: _7 C1 A
  72.     printf("UTC   | %d-%.2d-%.2d %.2d:%.2d:%.2d | MJD %.5f\n",% k1 s( @* p  i' D, w
  73.            utctime.year, utctime.month, utctime.day,
    * D( z& e, V/ I2 f: o
  74.            utctime.hour, utctime.minute, utctime.second,1 [0 t+ z" m4 @
  75.            mjd);/ h) M& i4 J2 s* j
  76. 8 d- h2 a' Z) g3 X  @9 |
  77.     printf("GPS   | %d-%.2d-%.2d %.2d:%.2d:%.2d | week %d %d s\n",* _* p# B8 H  a
  78.            gpstime.year, gpstime.month, gpstime.day,3 C6 F- `- `: D- {% m
  79.            gpstime.hour, gpstime.minute, gpstime.second,
    0 T: Z+ N2 S2 c$ m' ~
  80.            gpstimews.week, gpstimews.second);
    2 {% y- B4 M, [# F

  81. . `, F3 Y# V( C. `" X, d; B! O) k
  82.     Sleep(100);
    5 b2 }( q; s6 e! @# G
  83.   }' Q  c, V' n7 D; Y
  84. }3 D0 j# _+ C/ u+ ]  P; B; @

  85. . x7 @9 l9 S& f
  86. /****************************************************************
    - g% e& T! D& o
  87. * Function:    gotoxy
    ; R, R9 c* ?  v8 u
  88. * Description: Move the cursor to the specified position on the text screen.. c, z7 p: ^2 \; a) W
  89. * Input:       x: X axis coordinates.
    . {5 s. M6 d9 V2 W& ~; i
  90. *              y: Y axis coordinates.
    ; W2 y& g, F- |7 z7 l7 O* Z
  91. * Output:
    % W) M, d* U% |6 H" U
  92. * Return:5 [, \! ^+ x5 W. K
  93. *****************************************************************/& K1 B. j7 G1 p0 n
  94. static void gotoxy(int x, int y)
    + Z" r2 }9 d3 E  A+ _& P
  95. {
    2 x$ G3 a# Z0 M/ V' s# a1 I/ l
  96.   COORD  pos  = {x, y};
    + S2 R0 F2 [% I( v/ K- _/ }$ Q; G
  97.   HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    7 F* n0 B: N; L4 ]# H, K1 L& D
  98.   SetConsoleCursorPosition(hOut, pos);
    0 `* Q7 M0 }0 p/ ~) y2 O
  99. }
    6 W  @& x! I) C) n+ {8 t; q
复制代码

4 ?  H/ I/ z& r% r+ e3,运行效果' z7 e$ B& G2 M
7 r8 o5 G/ g- k) A. `# P2 k
% `+ S! v8 x) v/ t% B, w
  R* }; a  }" R
收藏 1 评论7 发布时间:2018-3-7 20:34

举报

7个回答
XinLiYF 回答时间:2018-3-7 20:35:11
可以直接移植到嵌入式端,非常方便。
xuanyuan1993 回答时间:2018-3-7 21:57:55
牛逼牛逼,回复拿分
maxtch 回答时间:2018-3-7 22:19:13
有必要如此折腾吗?不论是 C# 还是传统 C,标准库都有完整的时间与时区支持,不必自己劳心费神再写一遍了。
XinLiYF 回答时间:2018-3-7 22:50:51
maxtch 发表于 2018-3-7 22:19
& N4 O4 Y5 b2 Q* E* F有必要如此折腾吗?不论是 C# 还是传统 C,标准库都有完整的时间与时区支持,不必自己劳心费神再写一遍了。 ...

& _# s& p: j* H% e/ G, f7 V7 X朱利安日期,GPS周和周内秒,一般的库都没有吧,除非是专门做导航的库才会有这些。写这个是为了方便的在嵌入式端使用。
jjbboox 回答时间:2018-3-8 10:23:39
本帖最后由 jjbboox 于 2018-3-8 10:25 编辑
$ [1 r6 W( H8 L0 f) |# X
0 P! I9 h: p# C. c5 o9 a8 F直接 #include <time.h>不就OK了?0 U- s* O; u8 ^7 {% g5 g" r0 o
C51才需要自己实现,stm32的环境,何须如此麻烦。* \# }; S7 p5 x1 _# u# v
以上。7 A5 q& f* ]/ l4 J' g

  V& H9 |7 [. d
maxtch 回答时间:2018-3-8 11:38:10
XinLiYF 发表于 2018-3-7 22:50. U6 K2 Z! w; \! y; s0 a' O" P
朱利安日期,GPS周和周内秒,一般的库都没有吧,除非是专门做导航的库才会有这些。写这个是为了方便的在 ...

, w: o) {; l  L; f' a儒略历和格里历的转换一般支持时区转换的库都有。(那个不叫朱利安日期……)至于 GPS 周和周内秒,如果用现有库的话,也只要可以和 UNIX 时间戳互转就可以了,没那么复杂。
XinLiYF 回答时间:2018-3-8 13:31:08
maxtch 发表于 2018-3-8 11:38
/ s3 E( p; S: i- l6 K儒略历和格里历的转换一般支持时区转换的库都有。(那个不叫朱利安日期……)至于 GPS 周和周内秒,如果 ...

# f' E4 q; w  `6 w# t; r* F% ~' d6 x朱利安日期有这样叫的,是 Julian Date 音译过来的。

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版