(get_date): Apply relative times after time zone indicator, not

before.
This commit is contained in:
Paul Eggert
2000-06-14 17:57:26 +00:00
parent addd73b34a
commit 44579f77cf

View File

@@ -987,9 +987,6 @@ get_date (const char *p, const time_t *now)
{
tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
}
tm.tm_hour += pc.rel_hour;
tm.tm_min += pc.rel_minutes;
tm.tm_sec += pc.rel_seconds;
/* Let mktime deduce tm_isdst if we have an absolute time stamp,
or if the relative time stamp mentions days, months, or years. */
@@ -1061,6 +1058,29 @@ get_date (const char *p, const time_t *now)
Start -= delta;
}
/* Add relative hours, minutes, and seconds. Ignore leap seconds;
i.e. "+ 10 minutes" means 600 seconds, even if one of them is a
leap second. Typically this is not what the user wants, but it's
too hard to do it the other way, because the time zone indicator
must be applied before relative times, and if mktime is applied
again the time zone will be lost. */
{
time_t t0 = Start;
long d1 = 60 * 60 * (long) pc.rel_hour;
time_t t1 = t0 + d1;
long d2 = 60 * (long) pc.rel_minutes;
time_t t2 = t1 + d2;
int d3 = pc.rel_seconds;
time_t t3 = t2 + d3;
if ((d1 / (60 * 60) ^ pc.rel_hour)
| (d2 / 60 ^ pc.rel_minutes)
| ((t0 + d1 < t0) ^ (d1 < 0))
| ((t1 + d2 < t1) ^ (d2 < 0))
| ((t2 + d3 < t2) ^ (d3 < 0)))
return -1;
Start = t3;
}
return Start;
}