[M1 Mac, Big Sur 11.6.5, FLTK 1.3.8]
前回の続きです。
西暦1年1月1日からの経過日数をシリアル値とし、前回のケースであれば入力日前日のシリアル値に一致するまで架空の2月31日からデクリメントするという手法を取りました。月またぎ、年またぎ、うるう年に対応しています。
シリアル値を算出する関数はネットにありました。デクリメントで実在日を探し出すのは私のアイデアです。ちなみにExcelのシリアル値の起点は1900年1月1日です
こよみは本当にややこしいです。あまり関わりたくないですね。0時0分、たった1分間の作成ファイルが漏れないようにする工数としては割に合わないです。
// 日付シリアル値を算出する関数(西暦1年1月1日を0とする)
int GetDays(int y, int m, int d)
{
if (m <= 2) // 1・2月は前年の13・14月
{
--y;
m += 12;
}
int dy = 365 * (y - 1); // 経過年数×365日
int c = y / 100;
int dl = (y >> 2) - c + (c >> 2); // うるう年分
int dm = (m * 979 - 1033) >> 5; // 1月1日からm月1日までの日数
return dy + dl + dm + d - 1;
}
// デクリメントで実在する日を探索する関数
int GetDay(int y,int m, int d, int x){
for (d; d >0; d--){
int pre_day_dec = GetDays(y, m, d);
std::cout << "d " << d << " pre_day_dec " << pre_day_dec <<endl;
if (x == pre_day_dec){
return d;
}
}
}
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);
int days = GetDays(stoi(year), stoi(month), stoi(day));
int predays = days - 1;
std::cout << "days " << days << endl;
std::cout << "predays " << predays << endl;
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(&preDate_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;
int day2 = GetDay(pre_y, pre_m, pre_d, predays);
std::cout << "day2 " << day2 <<endl;
pre << pre_y;
pre << setw(2) << setfill('0') << pre_m;
pre << setw(2) << setfill('0') << day2;
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());
}