This internal helper uses proleptic Gregorian calendar arithmetic and maps
1970-01-01 to day zero. It is used by epoch_seconds_utc to convert the
date fields returned by date_and_time into an epoch-relative day count.
The function result is the signed day count relative to 1970-01-01.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=ik), | intent(in) | :: | y |
Civil year in the proleptic Gregorian calendar. |
||
| integer(kind=ik), | intent(in) | :: | m |
Civil month in the range 1 to 12. |
||
| integer(kind=ik), | intent(in) | :: | d |
Civil day of month. |
pure integer(ik) function days_from_civil(y, m, d) result(days) integer(ik), intent(in) :: y !! Civil year in the proleptic Gregorian calendar. integer(ik), intent(in) :: m !! Civil month in the range 1 to 12. integer(ik), intent(in) :: d !! Civil day of month. integer(ik) :: y2 !! Year adjusted so March is treated as the first month. integer(ik) :: m2 !! Month adjusted so March is treated as month 3 of the adjusted year. integer(ik) :: era !! Complete 400-year era containing the adjusted year. integer(ik) :: yoe !! Year of era. integer(ik) :: doy !! Day of adjusted year. integer(ik) :: doe !! Day of era. y2 = y m2 = m if (m2 <= 2_ik) then y2 = y2 - 1_ik m2 = m2 + 12_ik end if era = y2 / 400_ik yoe = y2 - era * 400_ik doy = (153_ik * (m2 - 3_ik) + 2_ik) / 5_ik + d - 1_ik doe = yoe * 365_ik + yoe / 4_ik - yoe / 100_ik + doy days = era * 146097_ik + doe - 719468_ik end function days_from_civil