从yyyymmddhhmmss string获得时间_t的最快方法
题
这是合法的吗?我试图在给定格式的Yyyymmddhhmmss等格式的字符串时尽可能快地到达time_t。
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);
}
如果我使用:
strptime(szYYYYMMDDHHMMSS, "%Y%m%d%H%M%S", &Tm);
我担心TM_YDAY,TM_WDAY,TM_ISDST,TM_GMTOFF,TM_ZONE很重要。我的日期是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()的性能是瓶颈
您的字符串以及time_t(通常使用)仅给出第二精度,因此您可以缓存转换值并每秒更新一次。
首先不要以弦乐形式使用时间戳。例如,将time_t值传递(包含秒钟以来的秒数,如time()),仅在/如果需要打印/显示给用户/时,仅将其转换为字符串。
不隶属于 StackOverflow