mktime і Time Zone
Jul. 15th, 2009 01:14 pmФункція mktime використовується для перетворення із broken-down time у класичний timestamp. Час, що передається структурою, mktime вважає локальним, прив'язаним до встановленої time zone. Через це можна отримати дивні результати. Наприклад, 1970-01-01 00:00:00 перестає бути нулем і стає -10800.
Існує функція timegm, що є розширенням GNU до libc, яка має той-же синтаксис, але вважає переданий час таким що належить до UTC. Ця функція є у мене в libc і є у libc FreeBSD 4.6 (я перевірив). Але у мані пишуть:
Існує функція timegm, що є розширенням GNU до libc, яка має той-же синтаксис, але вважає переданий час таким що належить до UTC. Ця функція є у мене в libc і є у libc FreeBSD 4.6 (я перевірив). Але у мані пишуть:
For a portable version of timegm(), set the TZ environment variable to
UTC, call mktime() and restore the value of TZ. Something like
#include <time.h>
#include <stdlib.h>
time_t my_timegm (struct tm *tm) {
time_t ret;
char *tz;
tz = getenv("TZ");
setenv("TZ", "", 1);
tzset();
ret = mktime(tm);
if (tz)
setenv("TZ", tz, 1);
else
unsetenv("TZ");
tzset();
return ret;
}