単位が日のデータを年, 月, 日,時間,分, 秒に分割する
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