从YYYYMMDDHHMMSSstring获取time_t的最快方法

这是合法吗? 我试图得到一个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_wdaytm_yday字段,并根据其他字段计算新值。 这同样适用于BSD扩展tm_gmtofftm_zone ,除了它们是从本地时区计算的。

请注意, mktime()使用本地时间,而不是UTC,所以如果您的输入日期是UTC,那么您的时区必须设置为UTC。

除非你确定它太慢,否则你最好使用getdate 。 否则,你所做的事情看起来相当不错,如果不是一点点神秘。

日期和时间处理一般有很多棘手的问题,所以我强烈建议strptime()而不是自己动手。 如果strptime()的性能是一个瓶颈,那么除了尝试创建一个更好的strptime()之外,还要绕过它,比如

  1. 你的字符串,以及time_t(通常使用的)只给出第二个精度,所以你可以缓存转换后的值,每秒更新一次。

  2. 首先不要使用字符串形式的时间戳。 例如,传递一个time_t值(包含从time()返回的Epoch秒数),并且仅当/如果需要打印/显示给用户/时将其转换为字符串。