summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/time/__tz.c12
-rw-r--r--src/time/localtime_r.c2
-rw-r--r--src/time/mktime.c6
-rw-r--r--src/time/strftime.c4
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':