diff --git a/Data/Attoparsec/Time.hs b/Data/Attoparsec/Time.hs
--- a/Data/Attoparsec/Time.hs
+++ b/Data/Attoparsec/Time.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-
 -- |
 -- Module:      Data.Aeson.Parser.Time
 -- Copyright:   (c) 2015-2016 Bryan O'Sullivan
@@ -21,7 +21,6 @@
     , zonedTime
     ) where
 
-import Prelude ()
 import Prelude.Compat
 
 import Control.Applicative ((<|>))
@@ -42,9 +41,9 @@
 day :: Parser Day
 day = do
   absOrNeg <- negate <$ char '-' <|> id <$ char '+' <|> pure id
-  y <- decimal <* char '-'
-  m <- twoDigits <* char '-'
-  d <- twoDigits
+  y <- (decimal <* char '-') <|> fail "date must be of form [+,-]YYYY-MM-DD"
+  m <- (twoDigits <* char '-') <|> fail "date must be of form [+,-]YYYY-MM-DD"
+  d <- twoDigits <|> fail "date must be of form [+,-]YYYY-MM-DD"
   maybe (fail "invalid date") return (fromGregorianValid (absOrNeg y) m d)
 
 -- | Parse a two-digit integer (e.g. day of month, hour).
diff --git a/Data/Attoparsec/Time/Internal.hs b/Data/Attoparsec/Time/Internal.hs
--- a/Data/Attoparsec/Time/Internal.hs
+++ b/Data/Attoparsec/Time/Internal.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE CPP #-}
-
+{-# LANGUAGE NoImplicitPrelude #-}
 -- |
 -- Module:      Data.Aeson.Internal.Time
 -- Copyright:   (c) 2015-2016 Bryan O'Sullivan
@@ -17,17 +17,37 @@
     , toTimeOfDay64
     ) where
 
-import Prelude ()
 import Prelude.Compat
 
 import Data.Int (Int64)
 import Data.Time
 import Unsafe.Coerce (unsafeCoerce)
 
+#if MIN_VERSION_time(1,6,0)
+
+import Data.Time.Clock (diffTimeToPicoseconds)
+
+#endif
+
 #if MIN_VERSION_base(4,7,0)
 
 import Data.Fixed (Pico, Fixed(MkFixed))
 
+#else
+
+import Data.Fixed (Pico)
+
+#endif
+
+#if !MIN_VERSION_time(1,6,0)
+
+diffTimeToPicoseconds :: DiffTime -> Integer
+diffTimeToPicoseconds = unsafeCoerce
+
+#endif
+
+#if MIN_VERSION_base(4,7,0)
+
 toPico :: Integer -> Pico
 toPico = MkFixed
 
@@ -36,8 +56,6 @@
 
 #else
 
-import Data.Fixed (Pico)
-
 toPico :: Integer -> Pico
 toPico = unsafeCoerce
 
@@ -51,11 +69,16 @@
                        {-# UNPACK #-} !Int
                        {-# UNPACK #-} !Int64
 
+posixDayLength :: DiffTime
+posixDayLength = 86400
+
 diffTimeOfDay64 :: DiffTime -> TimeOfDay64
-diffTimeOfDay64 t = TOD (fromIntegral h) (fromIntegral m) s
-  where (h,mp) = fromIntegral pico `quotRem` 3600000000000000
-        (m,s)  = mp `quotRem` 60000000000000
-        pico   = unsafeCoerce t :: Integer
+diffTimeOfDay64 t
+  | t >= posixDayLength = TOD 23 59 (60000000000000 + pico (t - posixDayLength))
+  | otherwise = TOD (fromIntegral h) (fromIntegral m) s
+    where (h,mp) = pico t `quotRem` 3600000000000000
+          (m,s)  = mp `quotRem` 60000000000000
+          pico   = fromIntegral . diffTimeToPicoseconds
 
 toTimeOfDay64 :: TimeOfDay -> TimeOfDay64
 toTimeOfDay64 (TimeOfDay h m s) = TOD h m (fromIntegral (fromPico s))
diff --git a/attoparsec-iso8601.cabal b/attoparsec-iso8601.cabal
--- a/attoparsec-iso8601.cabal
+++ b/attoparsec-iso8601.cabal
@@ -1,5 +1,5 @@
 name:            attoparsec-iso8601
-version:         1.0.0.0
+version:         1.0.1.0
 synopsis:        Parsing of ISO 8601 dates, originally from aeson.
 description:     Parsing of ISO 8601 dates, originally from aeson.
 license:         BSD3
@@ -37,7 +37,7 @@
   build-depends:
     attoparsec >= 0.13.0.1,
     base >= 4.5 && < 5,
-    base-compat >= 0.9.1 && < 0.10,
+    base-compat >= 0.9.1 && < 0.11,
     text >= 1.1.1.0,
     time >= 1.1.1.4
 
