这是合法的吗?我试图在给定格式的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_wdaytm_yday 字段,并根据其他字段为其计算新值。 BSD扩展也适用 tm_gmtofftm_zone, ,除了从当地时区计算出来。

但是请注意 mktime() 用途 当地的 时间,不是UTC,因此,如果您的输入日期是UTC,则必须将时区设置为UTC。

其他提示

您可能会更好地使用 GetDate 除非你 当然 太慢了。否则,您所做的事情看起来还不错,即使不是有点隐秘。

一般而言,日期和时间处理有很多棘手的陷阱,因此我强烈推荐Strptime(),而不是自己滚动。如果Strptime()的性能是瓶颈

  1. 您的字符串以及time_t(通常使用)仅给出第二精度,因此您可以缓存转换值并每秒更新一次。

  2. 首先不要以弦乐形式使用时间戳。例如,将time_t值传递(包含秒钟以来的秒数,如time()),仅在/如果需要打印/显示给用户/时,仅将其转换为字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top