在Fortran中转换Julian和Gregorian

时间:2016-09-27 07:48:36

标签: date fortran julian

我正在寻找关于在 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

如果这是完美无缺的,那么请将此视为分享作品的一种方式,但如果您发现任何问题或有其他解决方法的建议,我会全力以赴!

简要说明我实际在做什么:

  1. 例如,时间序列风速以标准格式存储,日期矢量(年,月,日,小时,分钟,秒)作为前6列,然后风速存储在另一列中。
  2. 确定风速峰值,需要在统计上独立,即相隔超过72小时
  3. 为了确保这一点,我存储了Julian,然后测试了JD + 3和JD-3相邻的任何相邻峰值
  4. 由于输出原因以及因为我不想拖动原始日期向量,我将Julian转换回Gregorian
  5. 并与常见问题解答保持一致:

    在Fortran 95/2003中转换Julian和Gregorian的最佳方法是什么?

0 个答案:

没有答案