song.yz@foxmail.com wechat: math-box

blog



简约儒略日与格里高利日期转换



在天文与航天计算中,经常需要在简约儒略日与格里高利日之间互相转化。 这里给出go语言代码,算法请参考sofa或海军天文台的novas。
  
package main

import (
	"fmt"
	"math"
)

func main(){
/*------------------------------------------------------
   Created  :  Song Yezhi   2023-3-16 23:41
      test for cal2jd  and jd2cal 
 	 
--------------------------------------------------------
   Email        : song.yz@foxmail.com  
   Copyrigt (C) : Chinese Academy of Sciences               
                  All rights reserved,  2023 
-------------------------------------------------------*/
	
	var hour float64

	year :=2023
	month := 3
	day := 16

	hour = 0.0

	mjd := cal2jd(year,month,day,hour)

	fmt.Printf("2023 3 16 0.0 mjd = %f \n", mjd )

    year,month,day ,hour= jd2cal(mjd )

	fmt.Printf("trans back to cal  = %d %d %d %f \n",year,month,day ,hour)

}


func cal2jd(year ,month,day int ,hour float64)(mjd float64){
/*------------------------------------------------------
   Created  :  Song Yezhi   2023-3-16 22:39
      
 	   Gregorian Calendar to  Modified Julian Date.

	   Referenc :  cal2jd.for in SOFA
--------------------------------------------------------
   Input Parameters   :
        
   Output Parameters  :

--------------------------------------------------------
   Email        : song.yz@foxmail.com  
   Copyrigt (C) : Chinese Academy of Sciences               
                  All rights reserved,  2023 
-------------------------------------------------------*/
	var MJD int 
	MJD = day-32075+1461*(year+4800+(month-14)/12)/4+
	    367*(month-2-(month-14)/12*12)/12-3*((year+4900+(month-14)/12)/100)/4
	mjd = float64(MJD) -0.5 + hour/24.0 -2400000.5
	return 
}

func  jd2cal(TJD float64) (year,month,day int, hour float64){
/*------------------------------------------------------
   Created  :  Song Yezhi   2023-3-16 22:52
    
*     THIS SUBROUTINE COMPUTES CALENDAR DATE AND TIME, GIVEN JULIAN
*     DATE.  INPUT JULIAN DATE CAN BE BASED ON ANY UT-LIKE TIME SCALE
*     (UTC, UT1, TT, ETC.) - OUTPUT TIME VALUE WILL HAVE SAME BASIS.
*     OUTPUT CALENDAR DATE WILL BE GREGORIAN.  ALGORITHM BY FLIEGEL AND
*     VAN FLANDERN.

Referenc :  CALDAT  in NOVAS_F3.1.f
*             DJ1            DJ2
*
*         2450123.7D0        0D0        (JD method)
*          2451545D0      -1421.3D0     (J2000 method)
*         2400000.5D0     50123.2D0     (MJD method)
*         2450123.5D0       0.2D0       (date & time method)
 	 
--------------------------------------------------------
   Input Parameters   :
        
   Output Parameters  :

--------------------------------------------------------
   Email        : song.yz@foxmail.com  
   Copyrigt (C) : Chinese Academy of Sciences               
                  All rights reserved,  2023 
-------------------------------------------------------*/
     
      TJD = TJD + 2400000.5
	  DJD := TJD +0.5
	  var JD ,L,N  int 
	  JD = int(DJD)	  
	  hour = math.Mod(DJD, 1.0)*24.0
	  L = JD+68569
	  N = 4*L/146097
	  L = L - (146097*N+3)/4
	  year = 4000*(L+1)/1461001
	  L = L  - 1461* year/4 + 31
	  month = 80*L/2447
	  day = L - 2447* month/80
	  L = month / 11
	  month  = month  + 2 -12*L 
	  year = 100*(N-49) + year + L
	  return 
	  
}
输出结果如下
2023 3 16 0.0 mjd = 60019.000000
trans back to cal  = 2023 3 16 0.000000