* libc/time/mktm_r.c: (__tzcalc_limits) Fix Julian day calculation.
* libc/time/mktime.c: (mktime) Fix tm_yday, tm_mday updating when timezone causes roll over.
This commit is contained in:
parent
eefc33184a
commit
f13f2da4ee
|
@ -1,3 +1,9 @@
|
|||
2011-10-11 Steven Abner <pheonix@zoomtown.com>
|
||||
|
||||
* libc/time/mktm_r.c: (__tzcalc_limits) Fix Julian day calculation.
|
||||
* libc/time/mktime.c: (mktime) Fix tm_yday, tm_mday updating when
|
||||
timezone causes roll over.
|
||||
|
||||
2011-10-10 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* libc/sys/arm/crt0.S: Synchronise with libgloss version.
|
||||
|
|
|
@ -178,29 +178,22 @@ _DEFUN(mktime, (tim_p),
|
|||
/* compute day of the year */
|
||||
tim_p->tm_yday = days;
|
||||
|
||||
if (tim_p->tm_year > 10000
|
||||
|| tim_p->tm_year < -10000)
|
||||
{
|
||||
if (tim_p->tm_year > 10000 || tim_p->tm_year < -10000)
|
||||
return (time_t) -1;
|
||||
}
|
||||
|
||||
/* compute days in other years */
|
||||
if (tim_p->tm_year > 70)
|
||||
if ((year = tim_p->tm_year) > 70)
|
||||
{
|
||||
for (year = 70; year < tim_p->tm_year; year++)
|
||||
days += _DAYS_IN_YEAR (year);
|
||||
}
|
||||
else if (tim_p->tm_year < 70)
|
||||
else if (year < 70)
|
||||
{
|
||||
for (year = 69; year > tim_p->tm_year; year--)
|
||||
days -= _DAYS_IN_YEAR (year);
|
||||
days -= _DAYS_IN_YEAR (year);
|
||||
}
|
||||
|
||||
/* compute day of the week */
|
||||
if ((tim_p->tm_wday = (days + 4) % 7) < 0)
|
||||
tim_p->tm_wday += 7;
|
||||
|
||||
/* compute total seconds */
|
||||
tim += (days * _SEC_IN_DAY);
|
||||
|
||||
|
@ -247,8 +240,29 @@ _DEFUN(mktime, (tim_p),
|
|||
if (!isdst)
|
||||
diff = -diff;
|
||||
tim_p->tm_sec += diff;
|
||||
validate_structure (tim_p);
|
||||
tim += diff; /* we also need to correct our current time calculation */
|
||||
int mday = tim_p->tm_mday;
|
||||
validate_structure (tim_p);
|
||||
mday = tim_p->tm_mday - mday;
|
||||
/* roll over occurred */
|
||||
if (mday) {
|
||||
/* compensate for month roll overs */
|
||||
if (mday > 1)
|
||||
mday = -1;
|
||||
else if (mday < -1)
|
||||
mday = 1;
|
||||
/* update days for wday calculation */
|
||||
days += mday;
|
||||
/* handle yday */
|
||||
if ((tim_p->tm_yday += mday) < 0) {
|
||||
--year;
|
||||
tim_p->tm_yday = _DAYS_IN_YEAR(year) - 1;
|
||||
} else {
|
||||
mday = _DAYS_IN_YEAR(year);
|
||||
if (tim_p->tm_yday > (mday - 1))
|
||||
tim_p->tm_yday -= mday;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -265,5 +279,9 @@ _DEFUN(mktime, (tim_p),
|
|||
/* reset isdst flag to what we have calculated */
|
||||
tim_p->tm_isdst = isdst;
|
||||
|
||||
/* compute day of the week */
|
||||
if ((tim_p->tm_wday = (days + 4) % 7) < 0)
|
||||
tim_p->tm_wday += 7;
|
||||
|
||||
return tim;
|
||||
}
|
||||
|
|
|
@ -216,10 +216,13 @@ _DEFUN (__tzcalc_limits, (year),
|
|||
|
||||
for (i = 0; i < 2; ++i)
|
||||
{
|
||||
if (tz->__tzrule[i].ch == 'J')
|
||||
if (tz->__tzrule[i].ch == 'J') {
|
||||
/* The Julian day n (1 <= n <= 365). */
|
||||
days = year_days + tz->__tzrule[i].d +
|
||||
(isleap(year) && tz->__tzrule[i].d >= 60);
|
||||
else if (tz->__tzrule[i].ch == 'D')
|
||||
/* Convert to yday */
|
||||
--days;
|
||||
} else if (tz->__tzrule[i].ch == 'D')
|
||||
days = year_days + tz->__tzrule[i].d;
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue