1 {-# LANGUAGE TypeFamilies #-}
2 {-# OPTIONS_GHC -fno-warn-orphans #-}
3 module Hcompta.Date where
5 import Control.Monad (Monad(..))
6 import qualified Data.Fixed
7 import Data.Function (($), (.), id)
9 import Data.Maybe (Maybe(..))
10 import qualified Data.Time.Calendar as Time
11 import qualified Data.Time.Clock as Time
12 import qualified Data.Time.Clock.POSIX as Time (posixSecondsToUTCTime)
13 import qualified Data.Time.Format as Time ()
14 import qualified Data.Time.LocalTime as Time
15 import Prelude (Integer, Num(..))
17 import Data.Proxy (Proxy(..))
30 date_gregorian :: d -> (Date_Year d, Date_Month d, Date_DoM d)
31 date_year :: d -> Date_Year d
32 date_month :: d -> Date_Month d
33 date_dom :: d -> Date_DoM d
34 date_tod :: d -> (Date_Hour d, Date_Minute d, Date_Second d)
35 date_hour :: d -> Date_Hour d
36 date_minute :: d -> Date_Minute d
37 date_second :: d -> Date_Second d
38 date_utc :: d -> Time.UTCTime
48 date_year = (\(x, _, _) -> x) . date_gregorian
49 date_month = (\(_, x, _) -> x) . date_gregorian
50 date_dom = (\(_, _, x) -> x) . date_gregorian
51 date_hour = (\(x, _, _) -> x) . date_tod
52 date_minute = (\(_, x, _) -> x) . date_tod
53 date_second = (\(_, _, x) -> x) . date_tod
58 instance Date Time.UTCTime where
59 type Date_Year Time.UTCTime = Integer
60 type Date_Month Time.UTCTime = Int
61 type Date_DoM Time.UTCTime = Int
62 type Date_Hour Time.UTCTime = Int
63 type Date_Minute Time.UTCTime = Int
64 type Date_Second Time.UTCTime = Data.Fixed.Pico
65 date_epoch = Time.posixSecondsToUTCTime 0
66 date_now = Time.getCurrentTime
67 date_gregorian = Time.toGregorian . Time.utctDay
69 case Time.timeToTimeOfDay $ Time.utctDayTime d of
70 Time.TimeOfDay h m s -> (h, m, s)
71 -- date_day = Time.utctDay
73 date_from y m d h mn s = do
74 gday <- Time.fromGregorianValid y m d
75 hod <- Time.makeTimeOfDayValid h mn s
78 Time.timeOfDayToTime hod
80 date_next_year_start :: Time.UTCTime -> Time.UTCTime
81 date_next_year_start d =
82 date_epoch{ Time.utctDay =
83 Time.addGregorianYearsClip
84 (date_year d + 1 - 1970)
88 date_bench :: IO a -> IO (a, Time.NominalDiffTime)
93 return (r, Time.diffUTCTime t1 t0)