@@ -1,4 +1,4 @@
1−{-# LANGUAGE CPP #-}
1+{-# LANGUAGE CPP, ScopedTypeVariables #-}
3module Data.Aeson.Parser.Time
3module Data.Aeson.Parser.Time
@@ -13,6 +13,8 @@ import Control.Applicative ((<$>), (<|>), empty)
13import Control.Monad (when, void)
13import Control.Monad (when, void)
14import qualified Data.Aeson.Types.Internal as Aeson
14import qualified Data.Aeson.Types.Internal as Aeson
15import Data.Attoparsec.Text as A
15import Data.Attoparsec.Text as A
16+import Data.Char (isDigit)
17+import Data.Fixed (Pico)
16import Data.Text (Text)
18import Data.Text (Text)
17import Data.Time.Calendar (Day, fromGregorianValid)
19import Data.Time.Calendar (Day, fromGregorianValid)
18import Data.Time.Clock (UTCTime)
20import Data.Time.Clock (UTCTime)
@@ -41,6 +43,19 @@ timeOfDay = do
41 s <- (fromRational . toRational) <$> double
43 s <- (fromRational . toRational) <$> double
42 maybe (fail "invalid time") return (Local.makeTimeOfDayValid h m s)
44 maybe (fail "invalid time") return (Local.makeTimeOfDayValid h m s)
48+ (w :: Int) <- decimal
52+ fs <- A.takeWhile isDigit
53+ let e = negate (T.length (T.takeWhile (=='0') fs)) - 1
55+ Right (f :: Int, _) -> return (fromIntegral w + fromIntegral f * 10 ^ e)
56+ _ -> fail "invalid number"
57+ _ -> fail "invalid number"
44timeZone :: A.Parser Local.TimeZone
59timeZone :: A.Parser Local.TimeZone
45timeZone = do
60timeZone = do