3 , DiddoEntry(DiddoEntry)
10 import Data.DateTime( diffSeconds )
11 import Data.Maybe( fromMaybe )
12 import Data.Time.Clock( UTCTime(), NominalDiffTime(), diffUTCTime )
13 import Data.Time.Format( parseTime, formatTime )
14 import Data.Time.LocalTime( TimeZone() )
15 import Data.Time.LocalTime( ZonedTime(..), zonedTimeToUTC, utcToZonedTime )
17 import qualified Data.Text as T
19 data LogEntry = LogEntry
20 { timestamp :: UTCTime
21 , timezone :: TimeZone
25 data DiddoEntry = DiddoEntry
26 { startTime :: ZonedTime
27 , endTime :: ZonedTime
31 formatDiddoEntry :: String -> DiddoEntry -> T.Text
32 formatDiddoEntry format entry = T.intercalate (T.pack ";")
33 [ T.pack $ formatTime defaultTimeLocale format (startTime entry)
34 , T.pack $ formatTime defaultTimeLocale format (endTime entry)
35 , T.pack $ diffTimeToHMSString $ diffUTCTime (zonedTimeToUTC (endTime entry)) (zonedTimeToUTC (startTime entry))
39 logToDiddoEntry :: UTCTime -> LogEntry -> DiddoEntry
40 logToDiddoEntry startutc logentry = DiddoEntry startZoned endZoned $ text logentry
42 startZoned = utcToZonedTime (timezone logentry) startutc
43 endZoned = utcToZonedTime (timezone logentry) $ timestamp logentry
45 parseDiddoLogline :: T.Text -> LogEntry
46 parseDiddoLogline line = LogEntry ts tz string
48 splitLine = T.splitOn (T.pack ";") line
49 string = T.intercalate (T.pack ";") $ tail splitLine
50 time = parseISOsecondsTime $ head splitLine
51 (ts,tz) = (zonedTimeToUTC time, zonedTimeZone time)
53 parseToZonedTime :: String -> String -> ZonedTime
54 parseToZonedTime format string = fromMaybe (error $ "Input data broken: " ++ string) $ parseTime defaultTimeLocale format string
56 parseISOsecondsTime :: T.Text -> ZonedTime
57 parseISOsecondsTime timestring = parseToZonedTime (iso8601DateFormat $ Just "%T%z") $ T.unpack timestring
59 diffTimeToHMSString :: NominalDiffTime -> String
60 diffTimeToHMSString delta = printf "%d:%02d:%02d" h m s
62 (mLeft, s) = floor delta `divMod` 60 :: (Int, Int)
63 (h, m) = mLeft `divMod` 60