------------------------------------------------------------------------------
-- |
-- Module:      Database.PostgreSQL.Simple.Time
-- Copyright:   (c) 2012 Leon P Smith
-- License:     BSD3
-- Maintainer:  Leon P Smith <leon@melding-monads.com>
-- Stability:   experimental
--
-- Time types that supports positive and negative infinity.   Also includes
-- new time parsers and printers with better performance than GHC's time
-- package.
--
-- The parsers only understand the specific variant of ISO 8601 that
-- PostgreSQL emits,  and the printers attempt to duplicate this syntax.
-- Thus the @datestyle@ parameter for the connection must be set to @ISO@.
--
-- These parsers and printers likely have problems and shortcomings.  Some
-- that I know of:
--
-- 1  @TimestampTZ@s before a timezone-dependent point in time cannot be
--    parsed,  because the parsers can only handle timezone offsets of a
--    integer number of minutes.  However, PostgreSQL will include seconds
--    in the offset, depending on the historical time standards for the city
--    identifying the time zone.
--
--    This boundary point often marks an event of some interest.  In the US
--    for example,  @timestamptz@s before @1883-Nov-18 12:00:00@ local time
--    cannot be parsed.  This is the moment Standard Railway Time went live.
--    Concretely, PostgreSQL will emit @1883-11-18 12:03:57-04:56:02@
--    instead of @1883-11-18 11:59:59-05@ when the @timezone@ parameter
--    for the connection is set to @America/New_York@.
--
-- 2. Dates and times surrounding @1582-Feb-24@,  the date the Gregorian
--    Calendar was introduced,  should be investigated for conversion errors.
--
-- 3. Points in time Before Christ are not also not supported.  For example,
--    PostgreSQL will emit @0045-01-01 BC@ for a value of a @date@ type.
--    This is the year that the Julian Calendar was adopted.
--
-- However, it should be noted that the old parsers also had issues 1 and 3.
-- Also, the new parsers now correctly handle time zones that include minutes
-- in their offset.  Most notably, this includes all of India and parts of
-- Canada and Australia.
--
-- PostgreSQL uses the zoneinfo database for its time zone information.
-- You can read more about PostgreSQL's date and time types at
-- <http://www.postgresql.org/docs/9.1/static/datatype-datetime.html>,
-- and zoneinfo at <http://en.wikipedia.org/wiki/Tz_database>.
--
------------------------------------------------------------------------------

module Database.PostgreSQL.Simple.Time
     ( Unbounded(..)
     , Date
     , UTCTimestamp
     , ZonedTimestamp
     , LocalTimestamp
     , parseDay
     , parseUTCTime
     , parseZonedTime
     , parseLocalTime
     , parseTimeOfDay
     , parseDate
     , parseUTCTimestamp
     , parseZonedTimestamp
     , parseLocalTimestamp
     , dayToBuilder
     , utcTimeToBuilder
     , zonedTimeToBuilder
     , localTimeToBuilder
     , timeOfDayToBuilder
     , timeZoneToBuilder
     , dateToBuilder
     , utcTimestampToBuilder
     , zonedTimestampToBuilder
     , localTimestampToBuilder
     , unboundedToBuilder
     , nominalDiffTimeToBuilder
     ) where

import Database.PostgreSQL.Simple.Time.Implementation