如何在不突破限制的情况下"Weekly"或"Monthly"设置 tm 值

How to set tm values "Weekly" or "Monthly" without breaking limits

本文关键字:Weekly Monthly 设置 tm 情况下 突破      更新时间:2023-10-16

基本上,我要做的是允许用户设置每周或每月事件,并根据用户输入创建和安排更多tm值。例如,假设您想从今天下午 4:00 开始安排每周一次的健身房课程。你想把这个两个三个星期。它将安排如下:

健身房第1周 4/12/2019 4:00 PM

健身房周 2 4/19/2019 4:00 PM

健身房第3周 4/26/2019 4:00 PM

或者,如果您每月执行一次,它将如下所示:

健身房 第 1 个月 4/12/2019 4:00 下午

健身房 月 2 5/12/2019 4:00 PM

健身房 第 3 个月 6/12/2019 4:00 下午

就目前而言,我目前可以做到这一点。但是,我遇到的问题是当用户设置的日期超过当前限制时。例如,假设您想安排四周,它应该如下所示:

健身房第1周 4/12/2019 4:00 PM

健身房周 2 4/19/2019 4:00 PM

健身房第3周 4/26/2019 4:00 PM

健身房周 4 5/3/2019 4:00 PM

相反,当我尝试移动超过4/30/2019时,我收到此错误

__crt_time_is_day_valid(tm_value->tm_year, tm_value->tm_mon, tm_value->tm_mday)

我猜这意味着它不是将日期设置为 5/3,而是将其设置为 4/33,这是无效的。

这就是我添加日期的方式:

周刊:

for (int i = 0; i < NumDates; i++) {
tempevent = event;
temptime = settime;
tempevent += " Week ";
tempevent += to_string(i + 1);
temptime.tm_mday += (7 * i);
addDate(tempevent, temptime);
}

每月:

for (int i = 0; i < NumDates; i++) {
tempevent = event;
temptime = settime;
tempevent += " Month ";
tempevent += to_string(i + 1);
temptime.tm_mon += i;
addDate(tempevent, temptime);
}

有没有办法将当前月份/年份的日期添加到下一个月份/年份,而不是添加无效日期?

好吧,我实际上自己找到了解决方案。我不确定这是否是最好的解决方案,但它有效。

time_t newtime;
std::time_t tt = system_clock::to_time_t(system_clock::now());
tm curtime = *localtime(&tt);
for (int i = 0; i < NumDates; i++) {
tempevent = event;
temptime = settime;
temptime.tm_isdst = curtime.tm_isdst;
tempevent += " Week ";
tempevent += to_string(i + 1);
temptime.tm_mday += (7 * i);
time_t newtemp = mktime(&temptime);
temptime = *localtime(&newtemp);
addDate(tempevent, temptime);
}

也许有点复杂,但基本上将 tm 更改为 time_t 可以解决问题。之后,我将其更改回 tm 值。但是,mktime 有一个问题,即小时经常偏离 1。据我了解,这是由于mktime猜测它是否是夏令时。因此,我将夏令时的时间设置为当前夏令时。

我唯一担心的是,如果用户在夏令时轮班后安排某些事情,可能会出现问题......我希望情况并非如此,但现在这解决了当前的问题。