这是合法吗? 我试图得到一个time_t尽可能快的给定一个string格式如YYYYMMDDHHMMSS。
static time_t ConvertToSecSince1970(char *szYYYYMMDDHHMMSS) { struct tm Tm; memset(&Tm, 0, sizeof(Tm)); Tm.tm_year = makeInt(szYYYYMMDDHHMMSS + 0, 4) - 1900; Tm.tm_mon = makeInt(szYYYYMMDDHHMMSS + 4, 2) - 1; Tm.tm_mday = makeInt(szYYYYMMDDHHMMSS + 6, 2); Tm.tm_hour = makeInt(szYYYYMMDDHHMMSS + 8, 2); Tm.tm_min = makeInt(szYYYYMMDDHHMMSS + 10, 2); Tm.tm_sec = makeInt(szYYYYMMDDHHMMSS + 12, 2); return mktime(&Tm); }
这似乎产生相同的答案,如果我创buildTM使用:
strptime(szYYYYMMDDHHMMSS, "%Y%m%d%H%M%S", &Tm);
我担心tm_yday,tm_wday,tm_isdst,tm_gmtoff,tm_zone是重要的。 我的date是UTC,所以我想gmtoff = 0和tm_zone = 0可能工作。
顺便说一下,这里是makeInt:
inline int makeInt(const char *p, int size) { const char *endp; int intval = 0; endp = p + size; while (p < endp) { intval = intval * 10 + *p - '0'; p++; } return intval; }
mktime()
忽略tm_wday
和tm_yday
字段,并根据其他字段计算新值。 这同样适用于BSD扩展tm_gmtoff
和tm_zone
,除了它们是从本地时区计算的。
请注意, mktime()
使用本地时间,而不是UTC,所以如果您的输入日期是UTC,那么您的时区必须设置为UTC。
除非你确定它太慢,否则你最好使用getdate 。 否则,你所做的事情看起来相当不错,如果不是一点点神秘。
日期和时间处理一般有很多棘手的问题,所以我强烈建议strptime()而不是自己动手。 如果strptime()的性能是一个瓶颈,那么除了尝试创建一个更好的strptime()之外,还要绕过它,比如
你的字符串,以及time_t(通常使用的)只给出第二个精度,所以你可以缓存转换后的值,每秒更新一次。
首先不要使用字符串形式的时间戳。 例如,传递一个time_t值(包含从time()返回的Epoch秒数),并且仅当/如果需要打印/显示给用户/时将其转换为字符串。