hourglass-0.2.10: Time/Compat.hs
-- |
-- Module : Time.Compat
-- License : BSD-style
-- Maintainer : Nicolas DI PRIMA <nicolas@di-prima.fr>
--
-- Basic Time conversion compatibility.
--
-- This module aims to help conversion between the types from the package
-- time to the package hourglass.
--
-- Example of use (extracted from file Example/Time/Compat.hs):
--
-- > import Data.Hourglass as H
-- > import Data.Hourglass.Compat as C
-- > import Data.Time as T
-- >
-- > transpose :: T.ZonedTime
-- > -> H.LocalTime H.DateTime
-- > transpose oldTime =
-- > H.localTime
-- > offsetTime
-- > (H.DateTime newDate timeofday)
-- > where
-- > newDate :: H.Date
-- > newDate = C.dateFromTAIEpoch $ T.toModifiedJulianDay $ T.localDay $ T.zonedTimeToLocalTime oldTime
-- >
-- > timeofday :: H.TimeOfDay
-- > timeofday = C.diffTimeToTimeOfDay $ T.timeOfDayToTime $ T.localTimeOfDay $ T.zonedTimeToLocalTime oldTime
-- >
-- > offsetTime = H.TimezoneOffset $ fromIntegral $ T.timeZoneMinutes $ T.zonedTimeZone oldTime
--
module Time.Compat
( dateFromPOSIXEpoch
, dateFromTAIEpoch
, diffTimeToTimeOfDay
) where
import Data.Hourglass
-- | Convert an integer which represent the Number of days (To/From) POSIX Epoch
-- to a Date (POSIX Epoch is 1970-01-01).
dateFromPOSIXEpoch :: Integer -- ^ number of days since POSIX Epoch
-> Date
dateFromPOSIXEpoch day = do
let sec = Elapsed $ fromIntegral $ day * 86400
timeConvert sec
-- | Number of days between POSIX Epoch and TAI Epoch
-- (between 1858-11-17 and 1970-01-01)
daysTAItoPOSIX :: Integer
daysTAItoPOSIX = 40587
-- | Convert an integer which represents the Number of days (To/From) TAI Epoch
-- This function allows use of the package time to easily convert the Day into
-- the Hourglass Date representation (TAI Epoch is 1858-11-17).
--
-- This function allows user to easily convert a Data.Time.Calendar.Day into Date
--
-- > import qualified Data.Time.Calendar as T
-- >
-- > timeDay :: T.Day
-- >
-- > dateFromTAIEpoch $ T.toModifiedJulianDay timeDay
dateFromTAIEpoch :: Integer -- ^ number of days since TAI Epoch
-> Date
dateFromTAIEpoch dtai =
dateFromPOSIXEpoch (dtai - daysTAItoPOSIX)
-- | Convert of differential of time of a day.
-- (it convers a Data.Time.Clock.DiffTime into a TimeOfDay)
--
-- Example with DiffTime type from time:
--
-- > import qualified Data.Time.Clock as T
-- >
-- > difftime :: T.DiffTime
-- >
-- > diffTimeToTimeOfDay difftime
--
-- Example with the TimeOfDay type from time:
--
-- > import qualified Data.Time.Clock as T
-- >
-- > timeofday :: T.TimeOfDay
-- >
-- > diffTimeToTimeOfDay $ T.timeOfDayToTime timeofday
diffTimeToTimeOfDay :: Real t
=> t -- ^ number of seconds of the time of the day
-> TimeOfDay
diffTimeToTimeOfDay dt = do
TimeOfDay
{ todHour = fromIntegral hours
, todMin = fromIntegral minutes
, todSec = fromIntegral seconds
, todNSec = fromIntegral nsecs
}
where
r :: Rational
r = toRational dt
(secs, nR) = properFraction r :: (Integer, Rational)
nsecs :: Integer
nsecs = round (nR * 1000000000)
(minsofday, seconds) = secs `divMod` 60 :: (Integer, Integer)
(hours, minutes) = minsofday `divMod` 60 :: (Integer, Integer)