mktime() टाइमज़ोन का पता लगाने के लिए tzname का उपयोग करता है। tzset() TZ enviroment चर से tzname चर प्रारंभ करता है। यदि टीजेड वैरिएबल वातावरण में दिखाई देता है लेकिन इसका मूल्य खाली है या इसका मूल्य सही ढंग से व्याख्या नहीं किया जा सकता है, तो यूटीसी का उपयोग किया जाता है।
एक पोर्टेबल (threadsafe नहीं) timegm manpage
#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;
}
एरिक एस रेमंड के अनुसार संस्करण अपने लेख Time, Clock, and Calendar Programming In C
time_t my_timegm(register struct tm * t)
/* struct tm to seconds since Unix epoch */
{
register long year;
register time_t result;
#define MONTHSPERYEAR 12 /* months per calendar year */
static const int cumdays[MONTHSPERYEAR] =
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
/*@ +matchanyintegral @*/
year = 1900 + t->tm_year + t->tm_mon/MONTHSPERYEAR;
result = (year - 1970) * 365 + cumdays[t->tm_mon % MONTHSPERYEAR];
result += (year - 1968)/4;
result -= (year - 1900)/100;
result += (year - 1600)/400;
if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) &&
(t->tm_mon % MONTHSPERYEAR) < 2)
result--;
result += t->tm_mday - 1;
result *= 24;
result += t->tm_hour;
result *= 60;
result += t->tm_min;
result *= 60;
result += t->tm_sec;
if (t->tm_isdst == 1)
result -= 3600;
/*@ -matchanyintegral @*/
return (result);
}
स्रोत
2012-07-04 07:25:17
"mktime केवल स्थानीय समय के रूप में टाइमस्टैम्प वापस आ जाएगी" - स्पष्ट रूप से, टाइमस्टैम्प एक UNIX टाइमस्टैम्प है (जिनके लिए टाइमज़ोन पूरी तरह से अप्रासंगिक हैं)। क्या होता है कि 'mktime' स्थानीय समय के रूप में _input_ को व्याख्या करता है। –