}
/*
- * We set this, but the timegm() function ignores
- * it. Note also that mktime() ignores it too,
- * and treats the time zone as local.
+ * We set the time zone, but the timegm()
+ * function ignores it. Note also that mktime()
+ * ignores it too, and treats the time zone as
+ * local.
*
* We can't store this value in s_tm.gtmoff,
* because the timegm() function helpfully zeros
* it out.
+ *
+ * So insyead of using stupid C library
+ * functions, we just roll our own.
*/
tz = tz_hour * 3600 + tz_min;
if (*tail == '-') tz *= -1;
done:
- *date = fr_unix_time_from_utc(tm);
-
- /*
- * Add in the time zone offset, which the posix
- * functions are too stupid to do.
- */
- *date += fr_unix_time_from_sec(tz);
+ tm->tm_gmtoff = tz;
+ *date = fr_unix_time_from_tm(tm);
*date += subseconds;
return 0;
p = strptime(my_str, "%b %e %Y %H:%M:%S %Z", tm);
if (p && (*p == '\0')) {
talloc_free(my_str);
- t = mktime(tm);
- *date = fr_unix_time_from_timeval(&(struct timeval) { .tv_sec = t });
+ *date = fr_unix_time_from_tm(tm);
return 0;
}
talloc_free(my_str);
p = strptime(date_str, "%b %e %Y %H:%M:%S %Z", tm);
if (p && (*p == '\0')) {
- t = mktime(tm);
- *date = fr_unix_time_from_timeval(&(struct timeval) { .tv_sec = t });
+ *date = fr_unix_time_from_tm(tm);
return 0;
}
tm->tm_min = atoi(f[1]);
}
- *date = fr_unix_time_from_utc(tm);
-
- /*
- * Add in the time zone offset, which the posix
- * functions are too stupid to do.
- */
- *date += gmtoff;
+ *date = fr_unix_time_from_tm(tm) + gmtoff;
return 0;
}
/*
* Based on https://blog.reverberate.org/2020/05/12/optimizing-date-algorithms.html
*/
-fr_unix_time_t fr_unix_time_from_utc(struct tm *tm)
+fr_unix_time_t fr_unix_time_from_tm(struct tm *tm)
{
static const uint16_t month_yday[12] = {0, 31, 59, 90, 120, 151,
181, 212, 243, 273, 304, 334};
* 2472692 adjusts the days for Unix epoch. It is calculated as
* (365.2425 * (4800 + 1970))
*/
- return fr_unix_time_from_sec((days - 2472692) * 86400 + (tm->tm_hour * 3600) + (tm->tm_min * 60) + tm->tm_sec);
+ return fr_unix_time_from_sec((days - 2472692) * 86400 + (tm->tm_hour * 3600) + (tm->tm_min * 60) + tm->tm_sec + tm->tm_gmtoff);
}
void fr_time_elapsed_update(fr_time_elapsed_t *elapsed, fr_time_t start, fr_time_t end) CC_HINT(nonnull);
void fr_time_elapsed_fprint(FILE *fp, fr_time_elapsed_t const *elapsed, char const *prefix, int tabs) CC_HINT(nonnull(1,2));
-fr_unix_time_t fr_unix_time_from_utc(struct tm *tm) CC_HINT(nonnull);
+fr_unix_time_t fr_unix_time_from_tm(struct tm *tm) CC_HINT(nonnull);
#ifdef __cplusplus
}