I fixed this code back in commit 
841b4a2d5, but didn't think carefully
enough about the behavior near zero, which meant it improperly rejected
1999-12-31 24:00:00.  Per report from Magnus Hagander.
 
        return -1;
    }
    /* check for just-barely overflow (okay except time-of-day wraps) */
-   if ((*result < 0 && date >= 0) ||
-       (*result >= 0 && date < 0))
+   /* caution: we want to allow 1999-12-31 24:00:00 */
+   if ((*result < 0 && date > 0) ||
+       (*result > 0 && date < -1))
    {
        *result = 0;            /* keep compiler quiet */
        return -1;
 
    if ((*result - time) / USECS_PER_DAY != dDate)
        return -1;
    /* check for just-barely overflow (okay except time-of-day wraps) */
-   if ((*result < 0 && dDate >= 0) ||
-       (*result >= 0 && dDate < 0))
+   /* caution: we want to allow 1999-12-31 24:00:00 */
+   if ((*result < 0 && dDate > 0) ||
+       (*result > 0 && dDate < -1))
        return -1;
 #else
    *result = dDate * SECS_PER_DAY + time;