on master help sign in
Add ToJSON and FromJSON instances for LocalTime
684baeaBryan O'Sullivan
Data/Aeson/Encode/Builder.hs+6−2
@@ -25,6 +25,7 @@ module Data.Aeson.Encode.Builder
25 , unquoted
25 , unquoted
26 , number
26 , number
27 , day
27 , day
28+ , localTime
28 , utcTime
29 , utcTime
29 , zonedTime
30 , zonedTime
30 , ascii2
31 , ascii2
@@ -228,9 +229,12 @@ diffTimeOfDay64 t = TOD (fromIntegral h) (fromIntegral m) s
228toTimeOfDay64 :: TimeOfDay -> TimeOfDay64
229toTimeOfDay64 :: TimeOfDay -> TimeOfDay64
229toTimeOfDay64 (TimeOfDay h m s) = TOD h m (fromIntegral (fromPico s))
230toTimeOfDay64 (TimeOfDay h m s) = TOD h m (fromIntegral (fromPico s))
230
231
232+localTime :: LocalTime -> Builder
233+localTime (LocalTime d t) = dayTime d (toTimeOfDay64 t)
234+{-# INLINE localTime #-}
235+
231zonedTime :: ZonedTime -> Builder
236zonedTime :: ZonedTime -> Builder
232−zonedTime (ZonedTime (LocalTime d t) z) =
237+zonedTime (ZonedTime t z) = localTime t <> timeZone z
233− dayTime d (toTimeOfDay64 t) <> timeZone z
234{-# INLINE zonedTime #-}
238{-# INLINE zonedTime #-}
235
239
236data T = T {-# UNPACK #-} !Char {-# UNPACK #-} !Char
240data T = T {-# UNPACK #-} !Char {-# UNPACK #-} !Char
Data/Aeson/Parser/Time.hs+1
@@ -14,6 +14,7 @@ module Data.Aeson.Parser.Time
14 (
14 (
15 run
15 run
16 , day
16 , day
17+ , localTime
17 , timeOfDay
18 , timeOfDay
18 , timeZone
19 , timeZone
19 , utcTime
20 , utcTime
Data/Aeson/Types/Instances.hs+8−1
@@ -77,7 +77,7 @@ import Data.Maybe (fromMaybe)
77import Data.Monoid (Dual(..), First(..), Last(..))
77import Data.Monoid (Dual(..), First(..), Last(..))
78import Data.Ratio (Ratio, (%), numerator, denominator)
78import Data.Ratio (Ratio, (%), numerator, denominator)
79import Data.Text (Text, pack, unpack)
79import Data.Text (Text, pack, unpack)
80−import Data.Time (Day, UTCTime, ZonedTime)
80+import Data.Time (Day, LocalTime, UTCTime, ZonedTime)
81import Data.Time.Format (FormatTime, formatTime, parseTime)
81import Data.Time.Format (FormatTime, formatTime, parseTime)
82import Data.Traversable as Tr (sequence, traverse)
82import Data.Traversable as Tr (sequence, traverse)
83import Data.Vector (Vector)
83import Data.Vector (Vector)
@@ -718,6 +718,13 @@ instance ToJSON Day where
718instance FromJSON Day where
718instance FromJSON Day where
719 parseJSON = withText "Day" (Time.run Time.day)
719 parseJSON = withText "Day" (Time.run Time.day)
720
720
721+instance ToJSON LocalTime where
722+ toJSON = stringEncoding
723+ toEncoding z = Encoding (E.localTime z)
724+
725+instance FromJSON LocalTime where
726+ parseJSON = withText "LocalTime" (Time.run Time.localTime)
727+
721instance ToJSON ZonedTime where
728instance ToJSON ZonedTime where
722 toJSON = stringEncoding
729 toJSON = stringEncoding
723
730
tests/Properties.hs+2−1
@@ -9,7 +9,7 @@ import Data.Aeson.Parser (value)
9import Data.Aeson.Types
9import Data.Aeson.Types
10import Data.ByteString.Builder (toLazyByteString)
10import Data.ByteString.Builder (toLazyByteString)
11import Data.Int (Int8)
11import Data.Int (Int8)
12−import Data.Time (Day, UTCTime, ZonedTime)
12+import Data.Time (Day, LocalTime, UTCTime, ZonedTime)
13import Encoders
13import Encoders
14import Instances ()
14import Instances ()
15import Test.Framework (Test, testGroup)
15import Test.Framework (Test, testGroup)
@@ -121,6 +121,7 @@ tests = testGroup "properties" [
121 , testProperty "Foo" $ roundTripEq (undefined :: Foo)
121 , testProperty "Foo" $ roundTripEq (undefined :: Foo)
122 , testProperty "Day" $ roundTripEq (undefined :: Day)
122 , testProperty "Day" $ roundTripEq (undefined :: Day)
123 , testProperty "DotNetTime" $ roundTripEq (undefined :: DotNetTime)
123 , testProperty "DotNetTime" $ roundTripEq (undefined :: DotNetTime)
124+ , testProperty "LocalTime" $ roundTripEq (undefined :: LocalTime)
124 , testProperty "UTCTime" $ roundTripEq (undefined :: UTCTime)
125 , testProperty "UTCTime" $ roundTripEq (undefined :: UTCTime)
125 , testProperty "ZonedTime" $ roundTripEq (undefined :: ZonedTime)
126 , testProperty "ZonedTime" $ roundTripEq (undefined :: ZonedTime)
126 , testGroup "ghcGenerics" [
127 , testGroup "ghcGenerics" [