Sha*_* RC 2 c++ iteration loops date
我有一个包含csv文件的文件夹.每个csv文件由日期命名(例如,01JAN2013.csv,02JAN2013.csv).我必须按日期顺序读取文件(开始日期和结束日期已知).
所以我试图循环从开始日期到结束日期的日期,以生成文件名.
目前我在做:
vector<string> dd{"01", "02", "03", "04", "05", "06", "07", "08", "09","10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20","21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"};
vector<string> mmm{"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG","SEP", "OCT", "NOV", "DEC"};
vector<string> yyyy{"2011","2012","2013","2014"};
string filePath=DataFolderPath;
for(int i=0;i<yyyy.size();i++)
{
for(int j=0;j<mmm.size();j++)
{
for(int k=0;k<dd.size();k++)
{
filePath.append(dd[k]);
filePath.append(mmm[j]);
filePath.append(yyyy[i]);
filePath.append(".csv");
}
}
}
Run Code Online (Sandbox Code Playgroud)
绝对丑陋,但它完成了工作.
有没有更简单的方法来循环C++中的日期.有点像:
for ( currentDate = starDate; currentDate < endDate; currentDate++) {
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
更新:
这是我最终使用的方法,结合以下两个答案:
typdef struct tm Time;
Time startDate=makeDate(3,1,2011);
Time endDate=makeDate(24,1,2014);
time_t end=mktime(&endDate);
for(Time date=startDate;end>=mktime(&date);++date.tm_mday)
{
char buffer[16];
strftime(buffer, sizeof(buffer), "%d%b%Y.csv", &date);
std::string filename(buffer);
//To convert month to CAPS
std::transform(filename.begin()+2, filename.begin()+5,filename.begin()+2, ::toupper);
std::cout << filename << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我还使用了一个makeDate基于paddy的答案的辅助函数,它返回一个struct tm而不是time_t:
Time makeDate( int day, int month, int year )
{
Time ttm = {0};
ttm.tm_mday= day;
ttm.tm_mon= month-1;
ttm.tm_year= year-1900;
return ttm;
}
Run Code Online (Sandbox Code Playgroud)
它可能实际上并不容易....但你可以使用时间函数<ctime>.像这样的东西:
string MakeFileName( time_t t )
{
static const char* months[] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
"JUL", "AUG", "SEP", "OCT", "NOV", "DEC" };
struct tm *ptm = localtime(&t);
char buffer[20];
snprintf( buffer, 20, "%02d%s%04d.CSV",
ptm->tm_day, months[ptm->tm_month], ptm->tm_year+1900 );
return string(buffer);
}
Run Code Online (Sandbox Code Playgroud)
现在只需在一个time_t值中确定您的开始和结束日期是正确的(记住,它是以秒为单位).你可以00:00:00暂时使用.
// Note that day and month are 1-based.
time_t GetDate( int day, int month, int year )
{
struct tm ttm = {0};
ttm.tm_day = day;
ttm.tm_month = month-1;
ttm.tm_year = year-1900;
return mktime(&ttm);
}
Run Code Online (Sandbox Code Playgroud)
有了这个助手,您可以轻松设置开始日期和结束日期:
time_t start = GetDate(1, 1, 2011);
time_t end = GetDate(28, 10, 2013);
for( time_t t = start; t <= end; t += 86400 )
{
string filename = MakeFileName(t);
// TODO...
}
Run Code Online (Sandbox Code Playgroud)