c++ - 如何在 C++ 中遍历日期范围

标签 c++ date loops iteration

我有一个包含 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");
        }
    }
}

绝对丑陋,但它完成了工作。

在 C++ 中是否有更简单的循环遍历日期的方法。类似的东西:

for ( currentDate = starDate; currentDate < endDate; currentDate++) {

//Do stuff

 }

更新:

这是我最终使用的方法,结合了以下两个答案:

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";
}

我还使用了一个基于 paddy 的答案的 makeDate 辅助函数,它返回一个 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;
}

最佳答案

它实际上可能不会更容易....但是您可以使用 <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);
}

现在只需在 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);
}

有了这个助手,您可以轻松设置开始和结束日期:

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...
}

关于c++ - 如何在 C++ 中遍历日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21472260/

相关文章:

c++ - 宽松还是严格的指针安全?

带链表的 C++ 迭代器

php - 如何从日期字段中从 MySQL 中减去 12 小时 30 分钟

python - for 循环后无法追加 numpy 数组吗?

c++ - 指针: &foo == foo?的指针

c++ - 按成员降序对多个对象进行排序?

php - 如何通过选择之间的任何日期来显示开始日期和结束日期之间的事件

python - 转换日期对象中的字符串(包含其他字符串) - Python

Java 增强的 For 循环

java - for循环生成 "1,4,9,16,25,36,49,64,81,100"