C 某个月的最后一天

C 某个月的最后一天,c,algorithm,date,C,Algorithm,Date,我有个问题找不到解决办法。或者至少是一个“好”的。 我想在C中找到给定一个月和一年的月的最后一天 例如: last_day(10, 2017) > 31 last_day(02, 2017) > 28 last_day(02, 2016) > 29 last_day(01, 2017) > 31 last_day(12, 2010) > 31 最后一天(X,Y)>X是月份,Y是年份 以下是我的想法:从Y年的X+1月份开始计算日期。从这个日期中减去1天 我想知道是否

我有个问题找不到解决办法。或者至少是一个“好”的。 我想在C中找到给定一个月和一年的月的最后一天

例如:

last_day(10, 2017) > 31
last_day(02, 2017) > 28
last_day(02, 2016) > 29
last_day(01, 2017) > 31
last_day(12, 2010) > 31
最后一天(X,Y)>X是月份,Y是年份

以下是我的想法:从Y年的X+1月份开始计算日期。从这个日期中减去1天

我想知道是否有比这更好的解决方案,因为这将使“简单”的事情“大量”运作

谢谢

编辑:

#包括
#包括
#包括
内部主(空){
struct-tm;
字符输出[256];
memset(&tm,0,sizeof(struct-tm));
tm.tm_mon=1;
tm.tmmday=0;
strftime(out,256,“%d-%m-%Y”、&tm);
printf(“%s”,out);
返回0;
}

我已经使用struct tm和day=0进行了测试,以获得前一天的结果,但不起作用

请在评论中指出,我已经将问题复杂化了很多

@agnisom Chattopadhyay在评论中说的话启发了我,那就是从查找表中获取日期

但是我做了一个函数,它做到了这一点

#include <stdio.h>

int days_in_month(int month, int year) {
    if ( year < 1582 ) return 0; /* Before this year the Gregorian Calendar was not define */  
    if ( month > 12 || month < 1 ) return 0;

    if (month == 4 || month == 6 || month == 9 || month == 11) return 30;
    else if (month == 2) return (((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) ? 29 : 28);
    return 31;
}

int main() {
    printf("%d\n", days_in_month(10, 2017));    
    printf("%d\n", days_in_month(2, 2000));
    printf("%d\n", days_in_month(2, 1300)); // Does not work !
    printf("%d\n", days_in_month(2, 2018));
    printf("%d\n", days_in_month(2, 2016));
}
#包括
月内整数天(整数月,整数年){
如果(年份<1582)在今年之前返回0;/*则公历未定义*/
如果(月>12 | |月<1)返回0;
如果(月=4 |月=6 |月=9 |月=11)返回30;
如果(月==2)返回((年%4==0和年%100!=0)| |(年%400==0))?29:28);
返回31;
}
int main(){
printf(“%d\n”,月内天数(2017年10月));
printf(“%d\n”,月内天数(2000年2月));
printf(“%d\n”,月内天数(21300))//不起作用!
printf(“%d\n”,月内天数(2018年2月));
printf(“%d\n”,月内天数(2016年2月));
}

显示输入,显示所需的输出。对于除2月以外的每个月,通过查表可以非常简单。对于二月,你需要计算一年中有28天还是29天。你说的“最后一天”是什么意思?最后一天的日期?或者工作日(如“周一”或“周五”)?我的帖子中有一个“示例”部分,但如果你愿意的话,我可以补充一些,这里的主要挑战不是检查当前年份是否是闰年,如果月份是
02
?所有其他案例都可以从表中查找。这不是表,而是代码。但是,它看起来还是对的,除了使用
long
,这是一个相当奇怪的选择。简单的
int
当然足够了,这也是我所期望的。我编辑我的答案是为了使用
int
而不是
long
。谢谢你。另外,我永远也不会理解使用
()
返回的样式,它不是一个函数,让它看起来像一个函数会让它看起来更像是在做相反的事情(“向下而不是向上调用堆栈”),这让我感到非常困惑。但我想每个人都有自己的想法。老实说,我反对这种风格,但我确实为我的工作编写了这段代码,而且编码规则说你需要将
()
返回一起使用。我将编辑我的代码以删除它们[因为这可能会让C的“新”用户感到困惑]。注意,欧洲大陆的闰年规则在不同的时间发生了变化。1752年,英国及其殖民地发生了变化。瑞典度过了一段愉快的时光,并设法把它弄错了。解决这个问题的一个步骤是1712年2月30日(IIRC年)。俄罗斯直到十月革命后才改变,根据世界上大多数日历,十月革命发生在11月。向后运行日历(公历的前身)是令人担忧的。
#include <stdio.h>

int days_in_month(int month, int year) {
    if ( year < 1582 ) return 0; /* Before this year the Gregorian Calendar was not define */  
    if ( month > 12 || month < 1 ) return 0;

    if (month == 4 || month == 6 || month == 9 || month == 11) return 30;
    else if (month == 2) return (((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) ? 29 : 28);
    return 31;
}

int main() {
    printf("%d\n", days_in_month(10, 2017));    
    printf("%d\n", days_in_month(2, 2000));
    printf("%d\n", days_in_month(2, 1300)); // Does not work !
    printf("%d\n", days_in_month(2, 2018));
    printf("%d\n", days_in_month(2, 2016));
}