如何检查是否存在日期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;