date_and_time reports local civil time plus a time-zone offset in
minutes. This internal helper converts the civil date to epoch days, adds
the local time of day, and subtracts the time-zone offset so start and stop
values can be differenced across day, month, or year boundaries. The
function result is UTC epoch seconds represented with kind rk.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | values(8) |
Eight-element result from |
pure real(rk) function epoch_seconds_utc(values) result(t) integer, intent(in) :: values(8) !! Eight-element result from `date_and_time(values=...)`. integer(ik) :: y !! Year extracted from `values(1)`. integer(ik) :: m !! Month extracted from `values(2)`. integer(ik) :: d !! Day extracted from `values(3)`. integer(ik) :: days !! Signed day count relative to 1970-01-01. integer(ik) :: secs !! Whole seconds from the local civil date and time fields. integer :: tzmin !! Time-zone offset in minutes east of UTC. y = int(values(1), ik) m = int(values(2), ik) d = int(values(3), ik) tzmin = values(4) if (abs(tzmin) > 24*60) tzmin = 0 days = days_from_civil(y, m, d) secs = days * 86400_ik + & int(values(5), ik) * 3600_ik + & int(values(6), ik) * 60_ik + & int(values(7), ik) t = real(secs, rk) + real(values(8), rk) / 1000.0_rk - real(tzmin, rk) * 60.0_rk end function epoch_seconds_utc