}
/*
- * 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).
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;
*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)
{