diff options
-rw-r--r-- | src/time/__tz.c | 12 | ||||
-rw-r--r-- | src/time/localtime_r.c | 2 | ||||
-rw-r--r-- | src/time/mktime.c | 6 | ||||
-rw-r--r-- | src/time/strftime.c | 4 |
4 files changed, 12 insertions, 12 deletions
diff --git a/src/time/__tz.c b/src/time/__tz.c index 102c8bc7..8b84b9bd 100644 --- a/src/time/__tz.c +++ b/src/time/__tz.c @@ -354,9 +354,9 @@ void __secs_to_zone(long long t, int local, int *isdst, long *offset, long *oppo size_t alt, i = scan_trans(t, local, &alt); if (i != -1) { *isdst = types[6*i+4]; - *offset = -(int32_t)zi_read32(types+6*i); + *offset = (int32_t)zi_read32(types+6*i); *zonename = (const char *)abbrevs + types[6*i+5]; - if (oppoff) *oppoff = -(int32_t)zi_read32(types+6*alt); + if (oppoff) *oppoff = (int32_t)zi_read32(types+6*alt); UNLOCK(lock); return; } @@ -390,15 +390,15 @@ void __secs_to_zone(long long t, int local, int *isdst, long *offset, long *oppo } std: *isdst = 0; - *offset = __timezone; - if (oppoff) *oppoff = dst_off; + *offset = -__timezone; + if (oppoff) *oppoff = -dst_off; *zonename = __tzname[0]; UNLOCK(lock); return; dst: *isdst = 1; - *offset = dst_off; - if (oppoff) *oppoff = __timezone; + *offset = -dst_off; + if (oppoff) *oppoff = -__timezone; *zonename = __tzname[1]; UNLOCK(lock); } diff --git a/src/time/localtime_r.c b/src/time/localtime_r.c index 1d43d9f4..2e62c29f 100644 --- a/src/time/localtime_r.c +++ b/src/time/localtime_r.c @@ -11,7 +11,7 @@ struct tm *__localtime_r(const time_t *restrict t, struct tm *restrict tm) return 0; } __secs_to_zone(*t, 0, &tm->tm_isdst, &tm->__tm_gmtoff, 0, &tm->__tm_zone); - if (__secs_to_tm((long long)*t - tm->__tm_gmtoff, tm) < 0) { + if (__secs_to_tm((long long)*t + tm->__tm_gmtoff, tm) < 0) { errno = EOVERFLOW; return 0; } diff --git a/src/time/mktime.c b/src/time/mktime.c index 0ab47802..bad3f076 100644 --- a/src/time/mktime.c +++ b/src/time/mktime.c @@ -10,14 +10,14 @@ time_t mktime(struct tm *tm) __secs_to_zone(t, 1, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone); if (tm->tm_isdst>=0 && new.tm_isdst!=tm->tm_isdst) - t += opp - new.__tm_gmtoff; + t -= opp - new.__tm_gmtoff; - t += new.__tm_gmtoff; + t -= new.__tm_gmtoff; if ((time_t)t != t) goto error; __secs_to_zone(t, 0, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone); - if (__secs_to_tm(t - new.__tm_gmtoff, &new) < 0) goto error; + if (__secs_to_tm(t + new.__tm_gmtoff, &new) < 0) goto error; *tm = new; return t; diff --git a/src/time/strftime.c b/src/time/strftime.c index 794fbe1d..e945bb7d 100644 --- a/src/time/strftime.c +++ b/src/time/strftime.c @@ -126,7 +126,7 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm * fmt = "%H:%M"; goto recu_strftime; case 's': - val = __tm_to_secs(tm) + tm->__tm_gmtoff; + val = __tm_to_secs(tm) - tm->__tm_gmtoff; width = 1; goto number; case 'S': @@ -178,7 +178,7 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm * return ""; } *l = snprintf(*s, sizeof *s, "%+.2d%.2d", - (-tm->__tm_gmtoff)/3600, + (tm->__tm_gmtoff)/3600, abs(tm->__tm_gmtoff%3600)/60); return *s; case 'Z': |