単位が日のデータを年, 月, 日,時間,分, 秒に分割する

dayはユリウス日で表されているとし、小数点以下の部分が時間、分、秒を日の単位で表しているとします。

例えば、120.543日は120と0.543日という意味です。この0.543の部分を時間,分, 秒に分割します。

real(8),parameter::eps=1.D-6
real(8)::day
day=day+eps
julian_day=int(day)
call caldat(julian_day,yr,mo,dy)
timed=dble(julian_day)               !day
r_time_hr=(elapsed_day-timed)*24.d0
hr=int(r_time_hr)                    !hour
r_time_mi=(r_time_hr-dble(hr))*60.d0
mi=int(r_time_mi)                    !minute
r_time_sc=int((r_time_mi-dble(mi))*60.d0)
sc=int(r_time_sc)                    !seccond

ユリウス日を年、月、日にもどすサブルーチン

subroutine caldat(JULIAN,IYYY,MONTH,DD)

INTEGER,intent(in):: JULIAN

integer,intent(out)::IYYY,MONTH,DD

! NAME IN/OUT DESCRIPTION

!

! JULIAN I THE JULIAN DAY

! IYYY O THE YEAR

! MONTH O THE MONTH (1 TO 12)

! DD O THE DAY OF THE MONTH

!

INTEGER IGREG

PARAMETER (IGREG=2299161)

INTEGER JALPHA,JA,JB,JC,JD,JE

!

IF (JULIAN .GE. IGREG) THEN

JALPHA = INT(((JULIAN - 1867216) - 0.25)/36524.25)

JA = JULIAN + 1 + JALPHA - INT(0.25*JALPHA)

ELSE

JA = JULIAN

ENDIF

JB = JA + 1524

JC = INT(6680. + ((JB - 2439870) - 122.1)/365.25)

JD = 365*JC + INT(0.25*JC)

JE = INT((JB - JD)/30.6001)

DD = JB - JD - INT(30.6001*JE)

MONTH = JE - 1

IF (MONTH .GT. 12) MONTH = MONTH - 12

IYYY = JC - 4715

IF (MONTH .GT. 2) IYYY = IYYY - 1

IF (IYYY .LE. 0) IYYY = IYYY - 1

RETURN

end subroutine caldat

年、月、日で表された日付をユリウス日に換算する関数

INTEGER FUNCTION JULDAY(IYYY,MONTH,DD)

INTEGER:: IYYY,MONTH,DD

!

! NAME IN/OUT DESCRIPTION

!

! IYYY I YEAR

! MONTH I MONTH (1 TO 12)

! DD I DAY OF MONTH

! JULDAY O JULIAN DAY

!

INTEGER IGREG

PARAMETER (IGREG = 15 + 31*(10 + 12*1582))

INTEGER JY,JM,JA

!

IF (IYYY .LT. 0) IYYY = IYYY + 1

IF (MONTH .GT. 2) THEN

JY = IYYY

JM = MONTH + 1

ELSE

JY = IYYY - 1

JM = MONTH + 13

ENDIF

JULDAY = INT(365.25*JY) + INT(30.6001*JM) + DD + 1720995

IF (DD + 31*(MONTH + 12*IYYY) .GE. IGREG) THEN

JA = INT(0.01*JY)

JULDAY = JULDAY + 2 - JA + INT(0.25*JA)

ENDIF

RETURN

end function julday