on master help sign in
Fix bug
12ce196Matt Parsons
Data/Aeson/Encoding/Builder.hs+1−1
@@ -194,7 +194,7 @@ day dd = encodeYear yr <>
194 encodeYear y
194 encodeYear y
195 | y >= 1000 = B.integerDec y
195 | y >= 1000 = B.integerDec y
196 | y >= 0 = BP.primBounded (ascii4 (padYear y)) ()
196 | y >= 0 = BP.primBounded (ascii4 (padYear y)) ()
197− | y >= -999 = BP.primBounded (ascii5 ('-',padYear y)) ()
197+ | y >= -999 = BP.primBounded (ascii5 ('-',padYear (- y))) ()
198 | otherwise = B.integerDec y
198 | otherwise = B.integerDec y
199 padYear y =
199 padYear y =
200 let (ab,c) = fromIntegral y `quotRem` 10
200 let (ab,c) = fromIntegral y `quotRem` 10
Data/Aeson/Parser/Time.hs+7−2
@@ -46,13 +46,18 @@ run p t = case A.parseOnly (p <* endOfInput) t of
46 Left err -> fail $ "could not parse date: " ++ err
46 Left err -> fail $ "could not parse date: " ++ err
47 Right r -> return r
47 Right r -> return r
48
48
49−-- | Parse a date of the form @YYYY-MM-DD@.
49+-- | Parse a date of the form @[+,-]YYYY-MM-DD@.
50day :: Parser Day
50day :: Parser Day
51day = do
51day = do
52+ absOrNeg <- choice
53+ [ char '-' *> pure negate
54+ , char '+' *> pure id
55+ , pure id
56+ ]
52 y <- decimal <* char '-'
57 y <- decimal <* char '-'
53 m <- twoDigits <* char '-'
58 m <- twoDigits <* char '-'
54 d <- twoDigits
59 d <- twoDigits
55− maybe (fail "invalid date") return (fromGregorianValid y m d)
60+ maybe (fail "invalid date") return (fromGregorianValid (absOrNeg y) m d)
56
61
57-- | Parse a two-digit integer (e.g. day of month, hour).
62-- | Parse a two-digit integer (e.g. day of month, hour).
58twoDigits :: Parser Int
63twoDigits :: Parser Int