@@ -54,7 +54,7 @@ import Data.Ratio (Ratio)
54import Data.Time.Calendar (Day, fromGregorian)
54import Data.Time.Calendar (Day, fromGregorian)
55import Data.Time.Clock (UTCTime)
55import Data.Time.Clock (UTCTime)
56import Data.Time.Format (parseTime)
56import Data.Time.Format (parseTime)
57−import Data.Time.LocalTime (TimeOfDay, makeTimeOfDayValid)
57+import Data.Time.LocalTime (ZonedTime, TimeOfDay, makeTimeOfDayValid)
58import Data.Typeable (Typeable, typeOf)
58import Data.Typeable (Typeable, typeOf)
59import Data.Word (Word64)
59import Data.Word (Word64)
60import Database.PostgreSQL.Simple.Internal
60import Database.PostgreSQL.Simple.Internal
@@ -209,6 +209,19 @@ instance FromField UTCTime where
209 Nothing -> returnError ConversionFailed f "could not parse"
209 Nothing -> returnError ConversionFailed f "could not parse"
210 where str = preprocess (B8.unpack bs)
210 where str = preprocess (B8.unpack bs)
212+instance FromField ZonedTime where
214+ case oid2builtin (typeOid f) of
215+ Just TimestampWithTimeZone -> doIt "%F %T%Q%z" (++ "00")
216+ _ -> const $ returnError Incompatible f "types incompatible"
218+ doIt _ _ Nothing = returnError UnexpectedNull f ""
219+ doIt fmt preprocess (Just bs) =
220+ case parseTime defaultTimeLocale fmt str of
222+ Nothing -> returnError ConversionFailed f "could not parse"
223+ where str = preprocess (B8.unpack bs)
212instance FromField Day where
225instance FromField Day where
213 fromField f = atto ok date f
226 fromField f = atto ok date f
214 where ok = mkCompats [Date]
227 where ok = mkCompats [Date]