如何检查是否存在日期C

如何检查是否存在日期C,c,validation,date,C,Validation,Date,如果我有以下用户输入:年、月和日。如何检查该日期是否确实存在 例如:2014-10-32(假)或2014-09-31(假)或2009-02-28(真)类似的内容可能会帮助您: // This calendar example #include<stdio.h> #define TRUE 1 #define FALSE 0 int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; char *months[

如果我有以下用户输入:年、月和日。如何检查该日期是否确实存在


例如:
2014-10-32(假)
2014-09-31(假)
2009-02-28(真)
类似的内容可能会帮助您:

// This calendar example

#include<stdio.h>

#define TRUE    1
#define FALSE   0

int days_in_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char *months[]=
{
    " ",
    "\n\n\nJanuary",
    "\n\n\nFebruary",
    "\n\n\nMarch",
    "\n\n\nApril",
    "\n\n\nMay",
    "\n\n\nJune",
    "\n\n\nJuly",
    "\n\n\nAugust",
    "\n\n\nSeptember",
    "\n\n\nOctober",
    "\n\n\nNovember",
    "\n\n\nDecember"
};


int inputyear(void)
{
    int year;

    printf("Please enter a year (example: 1999) : ");
    scanf("%d", &year);
    return year;
}

int determinedaycode(int year)
{
    int daycode;
    int d1, d2, d3;

    d1 = (year - 1.)/ 4.0;
    d2 = (year - 1.)/ 100.;
    d3 = (year - 1.)/ 400.;
    daycode = (year + d1 - d2 + d3) %7;
    return daycode;
}


int determineleapyear(int year)
{
    if(year% 4 == FALSE && year%100 != FALSE || year%400 == FALSE)
    {
        days_in_month[2] = 29;
        return TRUE;
    }
    else
    {
        days_in_month[2] = 28;
        return FALSE;
    }
}

void calendar(int year, int daycode)
{
    int month, day;
    for ( month = 1; month <= 12; month++ )
    {
        printf("%s", months[month]);
        printf("\n\nSun  Mon  Tue  Wed  Thu  Fri  Sat\n" );

        // Correct the position for the first date
        for ( day = 1; day <= 1 + daycode * 5; day++ )
        {
            printf(" ");
        }

        // Print all the dates for one month
        for ( day = 1; day <= days_in_month[month]; day++ )
        {
            printf("%2d", day );

            // Is day before Sat? Else start next line Sun.
            if ( ( day + daycode ) % 7 > 0 )
                printf("   " );
            else
                printf("\n " );
        }
            // Set position for next month
            daycode = ( daycode + days_in_month[month] ) % 7;
    }
}

int main(void)
{
    int year, daycode, leapyear;

    year = inputyear();
    daycode = determinedaycode(year);
    determineleapyear(year);
    calendar(year, daycode);
    printf("\n");
}
//此日历示例
#包括
#定义真1
#定义FALSE 0
月[]内的整数天={0,31,28,31,30,31,30,30,31,31,31};
字符*个月[]=
{
" ",
“\n\n\n手动”,
“\n\n\n二月”,
“\n\n\n搜索”,
“\n\n\nApril”,
“\n\n\n可能”,
“\n\n\n取消”,
“\n\n\n朱利”,
“\n\n\n古斯特”,
“\n\n\n成员”,
“\n\n\nOctober”,
“\n\n\n新成员”,
“\n\n\n十二月”
};
整数输入年份(无效)
{
国际年;
printf(“请输入年份(示例:1999):”;
scanf(“%d”和“年”);
回归年;
}
整数确定的代码(整数年)
{
整数日码;
int d1、d2、d3;
d1=(第1年)/4.0;
d2=第1年/100年。;
d3=(第1年)/400。;
日期代码=(年份+d1-d2+d3)%7;
返回日期代码;
}
整数年(整数年)
{
如果(年份%4==FALSE&&year%100!=FALSE | |年份%400==FALSE)
{
月内天数[2]=29;
返回TRUE;
}
其他的
{
月内天数[2]=28;
返回FALSE;
}
}
无效日历(整数年,整数日代码)
{
int月,日;
如果无法表示日历时间,则C API中的for(month=1;monthmktime()返回-1。以下代码段可以帮助您检查相同的情况(将day、month nMonth和year nYear作为参数):


上面的代码片段说明了这一想法。更健壮的代码可以在:

找到@AjayPunekar的可能副本,该链接描述了如何检查用户输入的日期在语法上是否正确。OP希望检查日期是否有效,如中所示,是否存在于日历上。一个好的解决方案是首先创建一个日历,并检查r日历上是否存在日期模式。您可能需要包含一些代码来处理闰年。
如果(年份%4==FALSE&&year%100!=FALSE | |年份%400==FALSE){//这是闰年,二月有29天。}否则{//这不是闰年,所以二月有28天。}
像这样??谢谢你的建议我认为这不是那么简单。事实上,
mktime
将时间标准化,如果可能的话,将返回
0
。因此,还应该检查调用后的值是否相同。你是对的@JensGustedt。从技术上讲,应该复制日期结构,然后ompare是原始的和通过调用mktime()修改的。上面共享的链接就是这样做的,并且有一个健壮的代码示例。我认为,您可以将收到的三个值作为参数进行比较。
tm tmDate;
memset( &tmDate, 0, sizeof(tm) );
tmDate.tm_mday = nDay;
tmDate.tm_mon = (nMonth - 1);
tmDate.tm_year = (nYear - 1900);

time_t tcal= mktime( &tmDate);
if( tcal == (time_t) -1 ) return false;