1 {-# LANGUAGE OverloadedStrings #-}
12 import Data.Maybe( fromMaybe )
13 import Data.Time.Clock( UTCTime(), NominalDiffTime(), diffUTCTime )
14 import Data.Time.Format( FormatTime(), parseTime, formatTime )
15 import Data.Time.LocalTime( TimeZone(), ZonedTime(..), zonedTimeToUTC, utcToZonedTime )
18 import Text.Printf( printf )
19 import qualified Data.Text as T
21 data LogEntry = LogEntry
22 { timestamp :: UTCTime
23 , timezone :: TimeZone
28 { startTime :: ZonedTime
29 , endTime :: ZonedTime
33 getTimestamp :: Diddo -> UTCTime
34 getTimestamp = zonedTimeToUTC . endTime
36 formatDiddo :: String -> Diddo -> T.Text
37 formatDiddo format (Diddo start end text) = T.intercalate ";" diddoline
39 diddoline = [startZonedString, endZonedString, delta, text]
40 startZonedString = timeToText format start
41 endZonedString = timeToText format end
42 startUTC = zonedTimeToUTC start
43 endUTC = zonedTimeToUTC end
44 delta = diffTimeToHMSString $ diffUTCTime endUTC startUTC
46 timeToText :: FormatTime a => String -> a -> T.Text
47 timeToText format = T.pack . formatTime defaultTimeLocale format
49 logToDiddo :: UTCTime -> LogEntry -> Diddo
50 logToDiddo startutc logentry = Diddo startZoned endZoned $ text logentry
52 startZoned = utcToZonedTime (timezone logentry) startutc
53 endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry
55 -- parseDiddoLogline' :: T.Text -> (UTCTime, LogEntry)
56 -- parseDiddoLogline' line = (ts, LogEntry ts tz string)
58 parseDiddoLogline :: T.Text -> (UTCTime, LogEntry)
59 parseDiddoLogline line = (ts, LogEntry ts tz string)
61 (timestring:strings) = T.splitOn ";" line
62 string = T.intercalate ";" strings
63 time = parseISOsecondsTime timestring
64 (ts,tz) = (zonedTimeToUTC time, zonedTimeZone time)
66 parseToZonedTime :: String -> String -> ZonedTime
67 parseToZonedTime format string = zt
69 zt = fromMaybe (error $ "Input data broken: " ++ string) parsedTime
70 parsedTime = parseTime defaultTimeLocale format string
72 parseISOsecondsTime :: T.Text -> ZonedTime
73 parseISOsecondsTime timestring = parseToZonedTime (iso8601DateFormat $ Just "%T%z") $ T.unpack timestring
75 diffTimeToHMSString :: NominalDiffTime -> T.Text
76 diffTimeToHMSString delta = T.pack $ printf "%d:%02d:%02d" h m s
78 (mLeft, s) = floor delta `divMod` 60 :: (Int, Int)
79 (h, m) = mLeft `divMod` 60