如何在不违反限制的情况下“每周”或“每月”设置tm值

时间:2019-04-12 22:59:58

标签: c++

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

健身房一周1 2019/4/12 4:00

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

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

或者,如果您每月进行一次,则可能是这样的:

健身房月1 4/12/2019 4:00 PM

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

健身房月3 6/12/2019 4:00 PM

按现状,我目前可以执行此操作。但是,我遇到的问题是用户设置的日期超过当前限制。例如,假设您要安排四个星期,它应该像这样:

健身房一周1 2019/4/12 4:00

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

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

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

相反,当我尝试越过4/30/2019时,会出现此错误

map.addLayer({
        "id": "places",
        "type": "circle",
        "paint":{
            "circle-color": "#E00819",
            "circle-radius": 6
        },
        "source": {
            "type": "geojson",
            "data": {
                "type": "FeatureCollection",
                "features": [{
                    "type": "Feature",
                    "properties": {
                        "description": "<p id='texto1'><strong>País:</strong> Colombia<br><strong>Ciudad:</strong> Bogotá<br><strong>Representante:</strong> Diana Carolina Rey<br><strong>Contacto:</strong> Tel: [int. +57 1] 320 1511<br><strong>Email:</strong> contactenos@fundalectura.org.co<br><strong>Web:</strong> <a href=\"http://fundalectura.org/\" target=\"_blank\" title=\"Opens in a new window\">www.fundalectura.org</a></p>"


                    },
                    "geometry": {
                        "type": "Point",
                        "coordinates": [-74.08083, 4.59889 ]
                    }
                }

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

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

每周:

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

每月:

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

是否可以将当前月/年溢出的日期添加到下一个日期,而不是添加无效的日期?

1 个答案:

答案 0 :(得分:0)

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

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猜测是否是夏令时。因此,我将夏令时设置为当前夏令时。

我唯一担心的是,如果用户在夏令时之后安排一些时间,可能会出现问题...我希望不是这种情况,但是现在这可以解决当前的问题。