static void show(timezone_t tz, char *zone, time_t t, bool v) { struct tm * tmp; struct tm * gmtmp; struct tm tm, gmtm; (void) printf("%-*s ", (int) longest, zone); if (v) { gmtmp = my_gmtime_r(&t, &gmtm); if (gmtmp == NULL) { printf(tformat(), t); } else { dumptime(gmtmp); (void) printf(" UT"); } (void) printf(" = "); } tmp = my_localtime_rz(tz, &t, &tm); dumptime(tmp); if (tmp != NULL) { if (*abbr(tmp) != '\0') (void) printf(" %s", abbr(tmp)); if (v) { long off = gmtoff(tmp, NULL, gmtmp); (void) printf(" isdst=%d", tmp->tm_isdst); if (off != LONG_MIN) (void) printf(" gmtoff=%ld", off); } } (void) printf("\n"); if (tmp != NULL && *abbr(tmp) != '\0') abbrok(abbr(tmp), zone); }
int KSystemTimeZoneBackend::offset(const KTimeZone *caller, time_t t) const { if (!caller->isValid() || t == KTimeZone::InvalidTime_t) return 0; // Make this time zone the current local time zone const QByteArray originalZone = qgetenv("TZ"); // save the original local time zone QByteArray tz = caller->name().toUtf8(); tz.prepend(":"); bool change = (tz != originalZone); if (change) { ::setenv("TZ", tz, 1); ::tzset(); } int secs = gmtoff(t); if (change) { // Restore the original local time zone if (originalZone.isEmpty()) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } return secs; }
/* Store into BUF, of size SIZE, a formatted UTC offset for the localtime *TM corresponding to time T. Use ISO 8601 format +HH:MM:SS, or -HH:MM:SS for time stamps west of Greenwich. Omit :SS if :SS is zero, and omit :MM too if :MM is also zero. If the time stamp represents an unknown UTC offset, use the format -00. Return the length of the resulting string, or -1 if the result is not representable as a string. If the string does not fit, return the length that the string would have been if it had fit; do not overrun the output buffer. */ static int format_utc_offset(char *buf, size_t size, struct tm const *tm, time_t t) { long off = gmtoff(tm, &t, NULL); char sign = ((off < 0 || (off == 0 && (*abbr(tm) == '-' || strcmp(abbr(tm), "zzz") == 0))) ? '-' : '+'); long hh; int mm, ss; if (off < 0) { if (off == LONG_MIN) return -1; off = -off; } ss = off % 60; mm = off / 60 % 60; hh = off / 60 / 60; return (ss ? snprintf(buf, size, "%c%02ld:%02d:%02d", sign, hh, mm, ss) : mm ? snprintf(buf, size, "%c%02ld:%02d", sign, hh, mm) : snprintf(buf, size, "%c%02ld", sign, hh)); }
int KTimeZone::currentOffset(Qt::TimeSpec basis) const { // Get current offset of this time zone to UTC const time_t now = time(0); const int secs = offset(now); switch (basis) { case Qt::LocalTime: // Return the current offset of this time zone to the local system time return secs - gmtoff(now); case Qt::UTC: // Return the current offset of this time zone to UTC return secs; default: break; } return 0; }
int KSystemTimeZoneBackend::offsetAtZoneTime(const KTimeZone *caller, const QDateTime &zoneDateTime, int *secondOffset) const { if (!caller->isValid() || !zoneDateTime.isValid() || zoneDateTime.timeSpec() != Qt::LocalTime) return 0; // Make this time zone the current local time zone const QByteArray originalZone = qgetenv("TZ"); // save the original local time zone QByteArray tz = caller->name().toUtf8(); tz.prepend(":"); bool change = (tz != originalZone); if (change) { ::setenv("TZ", tz, 1); ::tzset(); } // Convert zone time to UTC, and then get the offset to UTC tm tmtime; tmtime.tm_sec = zoneDateTime.time().second(); tmtime.tm_min = zoneDateTime.time().minute(); tmtime.tm_hour = zoneDateTime.time().hour(); tmtime.tm_mday = zoneDateTime.date().day(); tmtime.tm_mon = zoneDateTime.date().month() - 1; tmtime.tm_year = zoneDateTime.date().year() - 1900; tmtime.tm_isdst = -1; time_t t = mktime(&tmtime); int offset1 = (t == (time_t)-1) ? 0 : gmtoff(t); if (secondOffset) { int offset2 = offset1; if (t != (time_t)-1) { // Check if there is a backward DST change near to this time, by // checking if the UTC offset is different 1 hour later or earlier. // ASSUMPTION: DST SHIFTS ARE NEVER GREATER THAN 1 HOUR. int maxShift = 3600; offset2 = gmtoff(t + maxShift); if (offset2 < offset1) { // There is a backward DST shift during the following hour if (offset1 - offset2 < maxShift) offset2 = gmtoff(t + (offset1 - offset2)); } else if ((offset2 = gmtoff(t - maxShift)) > offset1) { // There is a backward DST shift during the previous hour if (offset2 - offset1 < maxShift) offset2 = gmtoff(t - (offset2 - offset1)); // Put UTC offsets into the correct order int o = offset1; offset1 = offset2; offset2 = o; } else offset2 = offset1; } *secondOffset = offset2; } if (change) { // Restore the original local time zone if (originalZone.isEmpty()) ::unsetenv("TZ"); else ::setenv("TZ", originalZone, 1); ::tzset(); } return offset1; }
time_t sl2mtime(time_t tt) { return tt + gmtoff(tt); }
/* * SEAlink time conversion * FIXME: I think there is one year difference, spec starts at 1 jan 1979, mtime starts at 1 jan 1980 */ time_t mtime2sl(time_t tt) { return tt - gmtoff(tt); }