datetime_from_unix_ms Function

public pure function datetime_from_unix_ms(ms) result(dt)

Inverse of unix_time_ms, producing a UTC datetime_t.

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: ms

Return Value type(datetime_t)


Calls

proc~~datetime_from_unix_ms~~CallsGraph proc~datetime_from_unix_ms datetime_from_unix_ms proc~civil_from_days civil_from_days proc~datetime_from_unix_ms->proc~civil_from_days

Called by

proc~~datetime_from_unix_ms~~CalledByGraph proc~datetime_from_unix_ms datetime_from_unix_ms proc~now_utc now_utc proc~now_utc->proc~datetime_from_unix_ms

Variables

Type Visibility Attributes Name Initial
integer(kind=int64), private :: d
integer(kind=int64), private :: days
integer(kind=int64), private :: m
integer(kind=int64), private :: rem
integer(kind=int64), private :: y

Source Code

   pure function datetime_from_unix_ms(ms) result(dt)
      !! Inverse of `unix_time_ms`, producing a UTC `datetime_t`.
      integer(int64), intent(in) :: ms
      type(datetime_t) :: dt

      integer(int64) :: days, rem, y, m, d

      ! Floored division, so that instants before the epoch land on the right
      ! day rather than being truncated towards it.
      days = ms/MS_PER_DAY
      rem = mod(ms, MS_PER_DAY)
      if (rem < 0_int64) then
         days = days - 1_int64
         rem = rem + MS_PER_DAY
      end if

      call civil_from_days(days, y, m, d)

      dt%year = int(y, default_int)
      dt%month = int(m, default_int)
      dt%day = int(d, default_int)
      dt%hour = int(rem/MS_PER_HOUR, default_int)
      rem = mod(rem, MS_PER_HOUR)
      dt%minute = int(rem/MS_PER_MINUTE, default_int)
      rem = mod(rem, MS_PER_MINUTE)
      dt%second = int(rem/MS_PER_SECOND, default_int)
      dt%millisecond = int(mod(rem, MS_PER_SECOND), default_int)
      dt%utc_offset_min = 0
   end function datetime_from_unix_ms