[C++] 39 FLTK : findコマンド生成アプリ/前日の取得 time_t型, tm構造体

[M1 Mac, Big Sur 11.6.5, FLTK 1.3.8]

作成中のアプリで検索期間を処理する際、開始日については入力した日の前日の日付文字列が必要になります。

time_t 型からtm構造体に変換するなどして対応しました。かなりややこしかったですし、まだ未解決の箇所もあります。

それは月をまたぐ場合です。例えば2022年3月1日の前日は2月28日ですが現時点のコードでは2月31日になってしまいます。

うるう年も含め対策が必要となります。Excelのシリアル値のようなものがあれば便利なんですが。

time_t preDate_t;
struct tm preDate;
const tm* preDate2;

void execute_cb(Fl_Widget*, void*) {
    stringstream cmd;
    stringstream pre;
    const char* dir = dir_input->value();
    const char* from_char = from_input->value();
    string from_str = string(from_char);

    std::cout << "from_str " << from_str << endl;
    string day = from_str.substr(6);
    string month = from_str.substr(4, 2);
    string year = from_str.substr(0, 4);

    std::cout << day << " " << month << " " << year <<endl;

    preDate = { 0, 0, 0, stoi(day) -1, stoi(month) -1, stoi(year)};
    preDate_t = std::mktime(&preDate);
    preDate2 = localtime(&fromDate_t);

    int pre_y = preDate2->tm_year;
    int pre_m = preDate2->tm_mon + 1;
    int pre_d = preDate2->tm_mday;

    std::cout << "pre_y pre_m pre_d " << pre_y << " " << pre_m << " " << pre_d <<endl;

    pre << preDate2->tm_year;
    pre << setw(2) << setfill('0') << preDate2->tm_mon;
    pre << setw(2) << setfill('0') << preDate2->tm_mday;
    
    std::cout << pre.str() << endl;
    
    cmd << "cd " << string(dir) << " && " << "find `pwd` -type file -newerct '" << pre.str() << " 23:59' ! -name '*DS_Store*'";
    std::cout << cmd.str() << endl;

    system((cmd.str()).c_str());
}