diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c index 037cdbbdcd7..5079868965c 100644 --- a/src/timezone/localtime.c +++ b/src/timezone/localtime.c @@ -1292,20 +1292,21 @@ increment_overflow(int *number, int delta) } /* - * Find the next DST transition time at or after the given time + * Find the next DST transition time after the given time * * *timep is the input value, the other parameters are output values. * * When the function result is 1, *boundary is set to the time_t - * representation of the next DST transition time at or after *timep, + * representation of the next DST transition time after *timep, * *before_gmtoff and *before_isdst are set to the GMT offset and isdst - * state prevailing just before that boundary, and *after_gmtoff and - * *after_isdst are set to the state prevailing just after that boundary. + * state prevailing just before that boundary (in particular, the state + * prevailing at *timep), and *after_gmtoff and *after_isdst are set to + * the state prevailing just after that boundary. * - * When the function result is 0, there is no known DST transition at or + * When the function result is 0, there is no known DST transition * after *timep, but *before_gmtoff and *before_isdst indicate the GMT * offset and isdst state prevailing at *timep. (This would occur in - * DST-less time zones, for example.) + * DST-less time zones, or if a zone has permanently ceased using DST.) * * A function result of -1 indicates failure (this case does not actually * occur in our current implementation). @@ -1385,16 +1386,16 @@ pg_next_dst_boundary(const pg_time_t *timep, return result; } - if (t > sp->ats[sp->timecnt - 1]) + if (t >= sp->ats[sp->timecnt - 1]) { - /* No known transition >= t, so use last known segment's type */ + /* No known transition > t, so use last known segment's type */ i = sp->types[sp->timecnt - 1]; ttisp = &sp->ttis[i]; *before_gmtoff = ttisp->tt_gmtoff; *before_isdst = ttisp->tt_isdst; return 0; } - if (t <= sp->ats[0]) + if (t < sp->ats[0]) { /* For "before", use lowest-numbered standard type */ i = 0; @@ -1415,10 +1416,10 @@ pg_next_dst_boundary(const pg_time_t *timep, *after_isdst = ttisp->tt_isdst; return 1; } - /* Else search to find the containing segment */ + /* Else search to find the boundary following t */ { int lo = 1; - int hi = sp->timecnt; + int hi = sp->timecnt - 1; while (lo < hi) {