timegm
C言語の gmtime の逆関数
C標準ライブラリにはないが、GNU 実装で存在する。
TZ の操作が含まれる分、パフォーマンスは悪い。
厳密にはエラートラップが必要かもしれない。(極めて考えにくいが)
マルチスレッドの場合には環境変数の変更が影響しないようにクリティカルセクションとして保護しなければならない。
code:timegm.c
time_t timegm(struct tm *tm) {
time_t result;
char *pOrgTz = NULL;
/* backup TZ */
pOrgTz = getenv("TZ");
if (pOrgTz) {
pOrgTz = strdup(pOrgTz);
}
/* Set UTC to TZ */
setenv("TZ", "", 1);
tzset();
result = mktime(tm);
/* restore TZ */
if (pOrgTz) {
setenv("TZ", pOrgTz, 1);
free(pOrgTz);
}
else {
unsetenv("TZ");
}
tzset();
return result;
}