@@ -169,11 +169,19 @@ ascii8 cs = BP.liftFixedToBounded $ (const cs) >$<
169169{-# INLINE ascii8 #-}
170170
171171day :: Day -> Builder
172−day dd = B.integerDec y <>
172+day dd = encodeYear y <>
173173 BP.primBounded (ascii6 ('-',(mh,(ml,('-',(dh,dl)))))) ()
174174 where (y,m,d) = toGregorian dd
175175 !(T mh ml) = twoDigits m
176176 !(T dh dl) = twoDigits d
177+ encodeYear y
178+ | y >= 1000 = B.integerDec y
179+ | y > 0 =
180+ let (ab,c) = fromIntegral y `quotRem` 10
181+ (a,b) = ab `quotRem` 10
182+ in BP.primBounded (ascii4 ('0',(digit a,(digit b,digit c)))) ()
183+ | otherwise =
184+ error "Data.Aeson.Encode.Builder.day: years BCE not supported"
177185{-# INLINE day #-}
178186
179187timeOfDay :: TimeOfDay -> Builder