lib/Data/Time/Clock/Internal/UTCTime.hs

    #include "HsConfigure.h"
    module Data.Time.Clock.Internal.UTCTime
    (
        -- * UTC
        -- | UTC is time as measured by a clock, corrected to keep pace with the earth by adding or removing
        -- occasional seconds, known as \"leap seconds\".
        -- These corrections are not predictable and are announced with six month's notice.
        -- No table of these corrections is provided, as any program compiled with it would become
        -- out of date in six months.
        --
        -- If you don't care about leap seconds, use 'UTCTime' and 'NominalDiffTime' for your clock calculations,
        -- and you'll be fine.
        UTCTime(..),
    ) where

    import Data.Typeable
    #if LANGUAGE_Rank2Types
    import Data.Data
    #endif
    import Control.DeepSeq
    import Data.Time.Calendar.Days
    import Data.Time.Clock.Internal.DiffTime

    -- | This is the simplest representation of UTC.
    -- It consists of the day number, and a time offset from midnight.
    -- Note that if a day has a leap second added to it, it will have 86401 seconds.
    data UTCTime = UTCTime {
        -- | the day
        utctDay :: Day,
        -- | the time from midnight, 0 <= t < 86401s (because of leap-seconds)
        utctDayTime :: DiffTime
    }
    #if LANGUAGE_DeriveDataTypeable
    #if LANGUAGE_Rank2Types
    #if HAS_DataPico
        deriving (Data, Typeable)
    #endif
    #endif
    #endif

    instance NFData UTCTime where
        rnf (UTCTime d t) = rnf d `seq` rnf t `seq` ()

    instance Eq UTCTime where
        (UTCTime da ta) == (UTCTime db tb) = (da == db) && (ta == tb)

    instance Ord UTCTime where
        compare (UTCTime da ta) (UTCTime db tb) = case (compare da db) of
            EQ -> compare ta tb
            cmp -> cmp