diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c index e499ba62f6777c4f16a9b816c2e2707f3ff5088a..8b332a126168a51ecb3f5c47ce55de0fde697e93 100644 --- a/src/timezone/localtime.c +++ b/src/timezone/localtime.c @@ -978,20 +978,21 @@ timesub(const pg_time_t *timep, long offset, } /* - * 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). @@ -1027,16 +1028,16 @@ pg_next_dst_boundary(const pg_time_t *timep, *before_isdst = ttisp->tt_isdst; return 0; } - 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; @@ -1057,9 +1058,9 @@ 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 */ for (i = 1; i < sp->timecnt; ++i) - if (t <= sp->ats[i]) + if (t < sp->ats[i]) break; j = sp->types[i - 1]; ttisp = &sp->ttis[j];