{- |
Module      : Time.System
License     : BSD-style
Copyright   : (c) 2014 Vincent Hanquez <vincent@snarc.org>
Stability   : experimental
Portability : unknown

Get the system timezone and current time value in multiple formats.
-}

module Time.System
  (
    -- * Current time, in computer-friendly format

    timeCurrent
  , timeCurrentP
    -- * Current time, in human-friendly format

  , dateCurrent
  , localDateCurrent
  , localDateCurrentAt
    -- * System timezone

  , timezoneCurrent
  ) where

import           Time.Internal
                   ( systemGetElapsed, systemGetElapsedP, systemGetTimezone )
import           Time.LocalTime
                   ( LocalTime, localTimeFromGlobal, localTimeSetTimezone )
import           Time.Time ( timeGetDateTimeOfDay )
import           Time.Types ( DateTime, Elapsed, ElapsedP, TimezoneOffset )

-- | Get the current number of seconds elapsed since the start of the Unix

-- epoch.

timeCurrent :: IO Elapsed
timeCurrent :: IO Elapsed
timeCurrent = IO Elapsed
systemGetElapsed

-- | Get the current number of seconds and nanoseconds since the start of the

-- Unix epoch (1970-01-01 00:00:00 UTC).

timeCurrentP :: IO ElapsedP
timeCurrentP :: IO ElapsedP
timeCurrentP = IO ElapsedP
systemGetElapsedP

-- | Get the current global date.

--

-- This is equivalent to:

--

-- > timeGetDateTimeOfDay `fmap` timeCurrentP

dateCurrent :: IO DateTime
dateCurrent :: IO DateTime
dateCurrent = ElapsedP -> DateTime
forall t. Timeable t => t -> DateTime
timeGetDateTimeOfDay (ElapsedP -> DateTime) -> IO ElapsedP -> IO DateTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ElapsedP
timeCurrentP

-- | Get the localized date by using 'timezoneCurrent' and 'dateCurrent'.

localDateCurrent :: IO (LocalTime DateTime)
localDateCurrent :: IO (LocalTime DateTime)
localDateCurrent = TimezoneOffset -> LocalTime DateTime -> LocalTime DateTime
forall t. Time t => TimezoneOffset -> LocalTime t -> LocalTime t
localTimeSetTimezone
  (TimezoneOffset -> LocalTime DateTime -> LocalTime DateTime)
-> IO TimezoneOffset
-> IO (LocalTime DateTime -> LocalTime DateTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO TimezoneOffset
timezoneCurrent
  IO (LocalTime DateTime -> LocalTime DateTime)
-> IO (LocalTime DateTime) -> IO (LocalTime DateTime)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (DateTime -> LocalTime DateTime
forall t. Time t => t -> LocalTime t
localTimeFromGlobal (DateTime -> LocalTime DateTime)
-> IO DateTime -> IO (LocalTime DateTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO DateTime
dateCurrent)

-- | Get the localized date at a specific timezone offset.

localDateCurrentAt :: TimezoneOffset -> IO (LocalTime DateTime)
localDateCurrentAt :: TimezoneOffset -> IO (LocalTime DateTime)
localDateCurrentAt TimezoneOffset
tz =
  TimezoneOffset -> LocalTime DateTime -> LocalTime DateTime
forall t. Time t => TimezoneOffset -> LocalTime t -> LocalTime t
localTimeSetTimezone TimezoneOffset
tz (LocalTime DateTime -> LocalTime DateTime)
-> (DateTime -> LocalTime DateTime)
-> DateTime
-> LocalTime DateTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DateTime -> LocalTime DateTime
forall t. Time t => t -> LocalTime t
localTimeFromGlobal (DateTime -> LocalTime DateTime)
-> IO DateTime -> IO (LocalTime DateTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO DateTime
dateCurrent

-- | Get the current timezone offset.

--

-- This includes daylight saving time when it is in operation.

timezoneCurrent :: IO TimezoneOffset
timezoneCurrent :: IO TimezoneOffset
timezoneCurrent = IO TimezoneOffset
systemGetTimezone