hodatime-0.1.1.1: src/Data/HodaTime/Instant/Internal.hs
module Data.HodaTime.Instant.Internal
(
Instant(..)
,fromUnixGetTimeOfDay
)
where
import Data.Word (Word32)
import Data.Int (Int32)
import Data.HodaTime.Constants (secondsPerDay, nsecsPerMicrosecond, unixDaysOffset)
import Control.Arrow ((>>>), first)
-- | Represents a point on a global time line. An Instant has no concept of time zone or
-- calendar. It is nothing more than the number of nanoseconds since epoch (1.March.2000)
data Instant = Instant { iDays :: Int32, iSecs :: Word32, iNsecs :: Word32 } -- TODO: Would this be better with only days and Word64 Nanos? See if the math is easier
deriving (Eq, Ord, Show) -- TODO: Remove Show
fromUnixGetTimeOfDay :: Int -> Word32 -> Instant
fromUnixGetTimeOfDay s ms = Instant days (fromIntegral secs) nsecs
where
(days, secs) = flip divMod secondsPerDay >>> first (fromIntegral . subtract unixDaysOffset) $ s
nsecs = ms * nsecsPerMicrosecond