@@ -61,7 +61,7 @@ import qualified Data.ByteString.Builder as B
6161import qualified Data.ByteString.Lazy as L
6262import Data.Aeson.Functions
6363import Data.Monoid ((<>), mempty)
64−import Data.Aeson.Encode.Functions (brackets, builder, foldable, list)
64+import Data.Aeson.Encode.Functions (brackets, builder, encode, foldable, list)
6565import qualified Data.Aeson.Parser.Time as Time
6666import Data.Aeson.Types.Class
6767import Data.Aeson.Types.Internal
@@ -79,7 +79,6 @@ import Data.Ratio (Ratio, (%), numerator, denominator)
7979import Data.Text (Text, pack, unpack)
8080import Data.Time (UTCTime(..), ZonedTime(..), TimeZone(..))
8181import Data.Time.Format (FormatTime, formatTime, parseTime)
82−import Data.Time.LocalTime (timeToTimeOfDay)
8382import Data.Traversable as Tr (sequence, traverse)
8483import Data.Vector (Vector)
8584import Data.Word (Word, Word8, Word16, Word32, Word64)
@@ -713,34 +712,25 @@ instance FromJSON DotNetTime where
713712 {-# INLINE parseJSON #-}
714713
715714instance ToJSON ZonedTime where
716− toJSON = toJSON . zonedTime
715+ toJSON = stringEncoding
717716
718− toEncoding = toEncoding . zonedTime
719−
720−zonedTime :: ZonedTime -> String
721−zonedTime t = formatTime defaultTimeLocale format t
722− where
723− format = "%FT%T." ++ formatMillis t ++ tzFormat
724− tzFormat | timeZoneMinutes (zonedTimeZone t) == 0 = "Z"
725− | otherwise = "%z"
717+ toEncoding z = Encoding (E.zonedTime z)
726718
727719formatMillis :: (FormatTime t) => t -> String
728−formatMillis = take 3 . formatSubseconds
729−
730−formatSubseconds :: (FormatTime t) => t -> String
731−formatSubseconds = formatTime defaultTimeLocale "%q"
720+formatMillis = take 3 . formatTime defaultTimeLocale "%q"
732721
733722instance FromJSON ZonedTime where
734723 parseJSON = withText "ZonedTime" (Time.run Time.zonedTime)
735724
736725instance ToJSON UTCTime where
737− toJSON = String . T.decodeLatin1 . L.toStrict . B.toLazyByteString . utcTime
726+ toJSON = stringEncoding
738727
739− toEncoding t = Encoding (utcTime t)
728+ toEncoding t = Encoding (E.utcTime t)
740729
741−utcTime :: UTCTime -> B.Builder
742−utcTime (UTCTime day secs) =
743− E.day day <> B.char7 'T' <> E.timeOfDay (timeToTimeOfDay secs) <> B.char7 'Z'
730+-- | Encode something to a JSON string.
731+stringEncoding :: (ToJSON a) => a -> Value
732+stringEncoding = String . T.decodeLatin1 . L.toStrict . encode
733+{-# INLINE stringEncoding #-}
744734
745735instance FromJSON UTCTime where
746736 parseJSON = withText "UTCTime" (Time.run Time.utcTime)