C 验证截至当前时间的日期

C 验证截至当前时间的日期,c,C,我正在用c语言编写一个程序,它需要有一个随机的日期,必须是有效的并且在当前日期之后。对于这一代人来说,根本没有任何问题。我唯一不能做的就是只接受最新的日期 我已经尝试过先检查日期是否有效,然后检查是否大于当前日期。然后我试着做相反的事情,但这些解决方案都不起作用 这是检查日期的函数: short dateControl( const unsigned short day, const unsigned short month, const unsigned short year, const i

我正在用c语言编写一个程序,它需要有一个随机的日期,必须是有效的并且在当前日期之后。对于这一代人来说,根本没有任何问题。我唯一不能做的就是只接受最新的日期

我已经尝试过先检查日期是否有效,然后检查是否大于当前日期。然后我试着做相反的事情,但这些解决方案都不起作用

这是检查日期的函数:

short dateControl( const unsigned short day, const unsigned short month, const unsigned short year, const int min_year, const int max_year, struct tm curTime)
{
    short correct = ZERO;

    if( (year >= curTime.tm_year) && (year <= max_year) ){
        if( (month >= 1) && (month <= 12) ){
            if( (day >= 1 && day <= 31) && (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) ){
                correct = ONE;
            }else if( (day >= 1 && day <= 30) && (month == 4 || month == 6 || month == 9 || month == 11) ){
                correct = ONE;
            }else if( (day >= 1 && day <= 28) && (month == 2) ){
                correct = ONE;
            }else if( day == 29 && month == 2 && (year % 400 == 0 ||(year % 4 == 0 && year % 100 != 0)) ){
                correct = ONE;
            }else{
                correct = ZERO;     
            }
        } else{
            correct = ZERO;         
            }
    }else{
        correct = ZERO;             
    }

if(correct == ONE){
    if( year > curTime.tm_year ){
            correct = ONE;
        }else if( year == curTime.tm_year ){
            if( month > curTime.tm_mon ){
                correct = ONE;
            }else if( month == curTime.tm_mon ){
                if( day > curTime.tm_mday ){
                    correct = ONE;
                }else if(day == curTime.tm_mday){
                    correct = ZERO;
                }else if(day < curTime.tm_mday){
                    correct = ZERO;
                }
            }else if( month < curTime.tm_mon ){
                correct = ZERO;
            }
        }
    }
}

    return correct;
}
我预计,如果生成的日期是2019年2月7日,而今天是2019年8月18日,则需要放弃生成的日期,并生成另一个日期

我正在用c语言编写一个程序,它需要有一个随机的日期,必须是有效的并且在当前日期之后。对于这一代人来说,根本没有任何问题。我唯一不能做的就是只接受最新的日期

您需要确定日期是否有效这一事实表明,生成随机日期的方式是一个问题


具体来说,如果您获取当前时间(使用
time()
)并向其添加随机正值(同时小心避免溢出),然后将结果转换为日期(例如使用
gmtime()
);然后,您可以保证随机日期是有效的,并且在将来不进行任何检查,您可以删除所有
dateControl()
code.

进行日期算术和比较的普遍接受的简单、正确的方法——这也适用于生成随机日期的问题——是使用
time\t
值完成大部分/所有工作,然后在最后转换为y/m/d。在现有代码中,部分问题可能是
tm_mon
从0到30,而不是从1到31。而且
tm_year
不包含完整的4位数年份;这实际上是y-1900。旁白:如果你面前的代码与这里的代码不匹配,那对我们来说就特别困难。请确保完全复制并粘贴您的代码!哦,我的坏消息是:你明白了,但我想说的是,
tm_mon
从0到11,而不是从1到12。永远不要自己做日期“算术”。充满了关于自建函数错误的报告。寻找一个提供您需要的函数的库,您就完成了。
day = random_int(1, 31);
month = random_int(1, 12);
year = random_int(local->tm_year, local->tm_year + 1);
validDate = dateControl(tempTrip.dep_date.day, tempTrip.dep_date.month, tempTrip.dep_date.year, local->tm_year, (local->tm_year + 1), *local);
    while(validDate == ZERO){
    tempDriver.sub_date.day = random_int(1, 31);
    tempDriver.sub_date.month = random_int(1, 12);
    tempDriver.sub_date.year = random_int(local->tm_year, (local->tm_year + 1));
    validDate = dateControl(tempTrip.dep_date.day, tempTrip.dep_date.month, tempTrip.dep_date.year, local->tm_year, (local->tm_year + 1), *local);
    }
    }