#include "HsConfigure.h"
module Data.Time.LocalTime.LocalTime
(
	
	LocalTime(..),
	
	utcToLocalTime,localTimeToUTC,ut1ToLocalTime,localTimeToUT1,
	
	ZonedTime(..),utcToZonedTime,zonedTimeToUTC,getZonedTime,utcToLocalZonedTime
) where
import Data.Time.LocalTime.TimeOfDay
import Data.Time.LocalTime.TimeZone
import Data.Time.Calendar
import Data.Time.Clock
import Control.DeepSeq
import Data.Typeable
#if LANGUAGE_Rank2Types
import Data.Data
#endif
data LocalTime = LocalTime {
	localDay    :: Day,
	localTimeOfDay   :: TimeOfDay
} deriving (Eq,Ord
#if LANGUAGE_DeriveDataTypeable
#if LANGUAGE_Rank2Types
#if HAS_DataPico
    ,Data, Typeable
#endif
#endif
#endif
    )
instance NFData LocalTime where
	rnf (LocalTime d t) = d `deepseq` t `deepseq` ()
instance Show LocalTime where
	show (LocalTime d t) = (showGregorian d) ++ " " ++ (show t)
utcToLocalTime :: TimeZone -> UTCTime -> LocalTime
utcToLocalTime tz (UTCTime day dt) = LocalTime (addDays i day) tod where
	(i,tod) = utcToLocalTimeOfDay tz (timeToTimeOfDay dt)
localTimeToUTC :: TimeZone -> LocalTime -> UTCTime
localTimeToUTC tz (LocalTime day tod) = UTCTime (addDays i day) (timeOfDayToTime todUTC) where
	(i,todUTC) = localToUTCTimeOfDay tz tod
ut1ToLocalTime :: Rational -> UniversalTime -> LocalTime
ut1ToLocalTime long (ModJulianDate date) = LocalTime (ModifiedJulianDay localMJD) (dayFractionToTimeOfDay localToDOffset) where
	localTime = date + long / 360 :: Rational
	localMJD = floor localTime
	localToDOffset = localTime  (fromIntegral localMJD)	
localTimeToUT1 :: Rational -> LocalTime -> UniversalTime
localTimeToUT1 long (LocalTime (ModifiedJulianDay localMJD) tod) = ModJulianDate ((fromIntegral localMJD) + (timeOfDayToDayFraction tod)  (long / 360))
data ZonedTime = ZonedTime {
	zonedTimeToLocalTime :: LocalTime,
	zonedTimeZone :: TimeZone
}
#if LANGUAGE_DeriveDataTypeable
#if LANGUAGE_Rank2Types
#if HAS_DataPico
    deriving (Data, Typeable)
#endif
#endif
#endif
instance NFData ZonedTime where
	rnf (ZonedTime lt z) = lt `deepseq` z `deepseq` ()
utcToZonedTime :: TimeZone -> UTCTime -> ZonedTime
utcToZonedTime zone time = ZonedTime (utcToLocalTime zone time) zone
zonedTimeToUTC :: ZonedTime -> UTCTime
zonedTimeToUTC (ZonedTime t zone) = localTimeToUTC zone t
instance Show ZonedTime where
	show (ZonedTime t zone) = show t ++ " " ++ show zone
instance Show UTCTime where
	show t = show (utcToZonedTime utc t)
getZonedTime :: IO ZonedTime
getZonedTime = do
	t <- getCurrentTime
	zone <- getTimeZone t
	return (utcToZonedTime zone t)
utcToLocalZonedTime :: UTCTime -> IO ZonedTime
utcToLocalZonedTime t = do
	zone <- getTimeZone t
	return (utcToZonedTime zone t)