xml <month>1,2,5~6</month>时间串解析
1. 需求描述
1,2,5~6代表时间范围,判断在此范围将执行相应的动作。
2. 实现思路
-
定义两个数组,一个存储数据,一个存储token。
-
遍历存储token的数组,如果是“,”把uint32_t变量的相应位置1, 如果是“a~b”把bit a至bit b都置1。
-
判断变量相应位是否为1来确认指定时间点是否满足范围限制。
3. 核心代码
bool timeGroup::CombineTimeParse(const std::string& CombineTimeStr, uint32_t& time){ const char *delim = ",~"; char *saveptr = NULL; char *cstr = new char[CombineTimeStr.length() + 1](); strcpy(cstr, CombineTimeStr.c_str()); char *p = cstr; std::vector<int> iv; std::vector<char> cv; while(*p){ switch(*p){ case ',': cv.push_back(','); break; case '~': cv.push_back('~'); break; default: break; } p++; } std::string::size_type i, j, k; char *result = strtok_r(cstr, delim, &saveptr); while(result){ iv.push_back(atoi(result)); result = strtok_r(NULL, delim, &saveptr); } for(i = 0, j = 0; i < cv.size(), j < iv.size(); i++){ if(cv[i] == ','){ time |= (1 << iv[j++]); }else{ for(k = iv[j]; k <= iv[j + 1]; k++){ time |= (1 << k); } j += 2; } } return true; }