我正在寻找关于在 Fortran 中转换Julian和Gregorian日历的几个函数/子例程的反馈。它是用于极端值分析的内部软件,因此需要很强大。
我目前正在使用我在网上找到的东西(信用卡:http://aa.usno.navy.mil/faq/docs/JD_Formula.php)稍作修改,以满足我的需要,同时将一小部分时间添加到朱利安日期。
将日期向量(格里高利格式)转换为Julian和小数时间:
INTEGER FUNCTION JULIAN(YEAR,MONTH,DAY)
IMPLICIT NONE
INTEGER, INTENT(IN) :: YEAR,MONTH,DAY
JULIAN = 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
END FUNCTION
REAL(DOUBLE) FUNCTION FRACTIONTIME(HOUR,MINUTE,SECOND)
IMPLICIT NONE
INTEGER, INTENT(IN) :: HOUR,MINUTE,SECOND
FRACTIONTIME = (HOUR + (MINUTE + SECOND/60.D0)/60.D0)/24.D0
END FUNCTION FRACTIONTIME
我存储的Julian日期是JD = Julian(...)+ Fractiontime(...)
转换回格里高利格式:
SUBROUTINE GREGORIAN(JD,YEAR,MONTH,DAY,HOUR,MINUTE,SECOND)
IMPLICIT NONE
REAL(DOUBLE), INTENT(IN) :: JD
INTEGER, INTENT(OUT) :: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
REAL(DOUBLE) :: JT
INTEGER :: I,J,K,L,N
L = INT(JD)+68569
N = 4*L/146097
L = L-(146097*N+3)/4
I = 4000*(L+1)/1461001
L = L-1461*I/4+31
J = 80*L/2447
K = L-2447*J/80
L = J/11
J = J+2-12*L
I = 100*(N-49)+I+L
YEAR = I
MONTH = J
DAY = K
JT = DMOD(JD,1.D0)*24.D0
HOUR = INT(JT)
JT = DMOD(JT,1.D0)*60.D0
MINUTE = INT(JT)
JT = DMOD(JT,1.D0)*60.D0
SECOND = NINT(JT)
IF (SECOND == 60) THEN
SECOND = SECOND-60
MINUTE = MINUTE+1
END IF
END SUBROUTINE GREGORIAN
如果这是完美无缺的,那么请将此视为分享作品的一种方式,但如果您发现任何问题或有其他解决方法的建议,我会全力以赴!
简要说明我实际在做什么:
并与常见问题解答保持一致:
在Fortran 95/2003中转换Julian和Gregorian的最佳方法是什么?