如何解决从YYYYMMDDHHMMSS字符串中获取time_t的最快方法
|| 这是合法的吗?我正在尝试给定格式为YYYYMMDDHHMMSS的字符串,尽快达到time_t。static time_t ConvertToSecSince1970(char *szYYYYMMDDHHMMSS)
{
struct tm Tm;
memset(&Tm,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);
}
如果我使用以下方法创建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
相同,除了它们是从本地时区计算得出的。
但是请注意,“ 3”使用本地时间,而不是UTC,因此,如果您输入的日期是UTC,则您的时区必须设置为UTC。
, 除非您确定它太慢,否则最好使用getdate。否则,您所做的事情看起来似乎还算不错,即使不是一点点神秘。
, 一般而言,日期和时间处理有很多棘手的问题,因此我强烈建议您使用strptime()而不是自己动手。如果strptime()的性能是瓶颈,则可以尝试尝试创建更好的strptime()以外的其他方法来解决它,例如
您的字符串以及time_t(通常使用该字符串)仅提供秒精度,因此您可以缓存转换后的值并每秒仅更新一次。
首先不要使用字符串形式的时间戳。例如。传递一个time_t值(包含自从time()返回的纪元以来的秒数),并且仅在/如果需要打印/将其显示给用户/时将其转换为字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。