我有一个包含
的字符串 YYYY/MON/DATE-HR:MIN:SEC
我想获取所有字段的各个值,尤其是在TM结构中存储的秒数。
是否有任何功能可以进行此转换(或)实现它的任何其他方式?
答案 0 :(得分:2)
实现它的其他方式(假设为YYYY/MM/DD-HH:MM:SS
):
struct tm Str2Tm(const char* str)
{
struct tm var = {0};
var.tm_isdst = -1; // daylight saving time information is not available
var.tm_year = 1000*(str[0]-'0')+100*(str[1]-'0')+10*(str[2]-'0')+1*(str[3]-'0')-1900;
var.tm_mon = 10*(str[ 5]-'0')+1*(str[ 6]-'0')-1;
var.tm_mday = 10*(str[ 8]-'0')+1*(str[ 9]-'0');
var.tm_hour = 10*(str[11]-'0')+1*(str[12]-'0');
var.tm_min = 10*(str[14]-'0')+1*(str[15]-'0');
var.tm_sec = 10*(str[17]-'0')+1*(str[18]-'0');
return var;
}
如果月份是三字母格式,那么您必须以不同的方式获得var.tm_mon
:
int GetMon(const char* str)
{
static const char mon_name[][4] =
{
"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
};
for (int i=0; i<12; i++)
{
if (str[5]==mon_name[i][0] && str[6]==mon_name[i][1] && str[7]==mon_name[i][2])
return i;
}
return -1;
}
答案 1 :(得分:0)
您可以尝试使用sscanf()
void filltm(char* str , struct tm* tim)
{
sscanf(str , "%d/%d/%d-%d:%d:%d" , &tim->tm_year , &tim->tm_mon , &tim->tm_mday , &tim->tm_hour , &tim->tm_min , &tim->tm_sec);
tim->tm_year -= 1900;
tim->tm_mon--;
}
答案 2 :(得分:-1)
基本错误检查的简单sscanf()
解决方案。
struct tm tm = {0};
if (6 != sscanf(str, "%d/%d/%d-%d:%d:%d",
&tm.tm_year, &tm.tm_mon, &tm.tm_mday,
&tm.tm_hour, &tm.tm_min, &tm.tm_sec)) Handle_BadInput();
tm.tm_year -= 1900;
tm.tm_mon--;
tm.tm_isdst = -1;
localtime(&tm); // set tm_wday, tm_yday fields.