开始日期,加天数,求结束日期(跨年,闰年)
2017-11-30 20:59
239 查看
输入一个日期:startdate(年月日)和天数(days>=1),输出字该输入日期days天的日期enddate(即enddate=startdate+days)要求输入和输出的年份为四位整数,并确保得到有效的输入数据。同时需要考虑跨年和闰年等情况,闰年用自定义函数计算,日期自定义结构体描述。
#include "stdio.h" int Is_Special_Year(int year); int From_Year_Day_Num(int year,int month,int day); void main() { struct Input_Date { int year; int month; int day; int day_num; }; struct Input_Date test_input_date; printf("xxxx-xx-xx,n格式输入\n"); scanf("%d-%d-%d,%d",&test_input_date.year,&test_input_date.month,&test_input_date.day,&test_input_date.day_num); Print_Dest_Date(test_input_date.year,test_input_date.month,test_input_date.day,test_input_date.day_num); //From_Year_Day_Date(2017,1); } // 判断是否为闰年 int Is_Special_Year(int year) { if(year%4==0&&year%100!=0||year%400==0) { printf("is\n"); return 1; } else { printf("isn't\n"); return 0; } } // 判断一年当中的第几天 int From_Year_Day_Num(int year,int month,int day) { int day_num=0; int temp=Is_Special_Year(year); switch(month) { case 1: day_num=0;break; case 2: day_num=31;break; case 3: day_num=31+28+temp;break; case 4: day_num=31+28+31+temp;break; case 5: day_num=31+28+31+30+temp;break; case 6: day_num=31+28+31+30+31+temp;break; case 7: day_num=31+28+31+30+31+30+temp;break; case 8: day_num=31+28+31+30+31+30+31+temp;break; case 9: day_num=31+28+31+30+31+30+31+31+temp;break; case 10: day_num=31+28+31+30+31+30+31+31+30+temp;break; case 11: day_num=31+28+31+30+31+30+31+31+30+31+temp;break; case 12: day_num=31+28+31+30+31+30+31+31+30+31+30+temp;break; } day_num+=day; return day_num; } //根据输出的天数判断当前日期 int From_Year_Day_Date(int year,int day_num) { int i; int temp_month,temp_day; int sum =0; int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(Is_Special_Year(year)) { a[2] =29; } for(i=0;i<12;i++) { sum=sum+a[i]; if(day_num>sum && day_num<=sum+a[i+1]) { temp_month = i+1; temp_day = day_num-sum; } } //输出目的日期 printf("enddate日期为:%d-%d-%d",year,temp_month,temp_day); } // 输出enddate void Print_Dest_Date(int year,int month,int day,int day_num) { //起始日期-距离该年第多少天----临时变量 int temp_start_days = From_Year_Day_Num(year,month,day); printf("距离该年第多少天-:%d\n",temp_start_days); //判断有没有跨年的变量 int is_temp_over_year; //临时年份- int temp_year; //距离输入的起始年开始的总天数 printf("距离输入的起始年开始的总天数-:%d\n",day_num); is_temp_over_year = temp_start_days + day_num; printf("距离输入的起始年开始的总天数-:%d\n",is_temp_over_year); //思路:首先判断该年是否是闰年--- // Yes:根据现有的总天数判断有没有跨年, // 若没有跨年,直接调用 From_Year_Day_Date // 若跨年,对其进行% temp_year = year; int flag = 1; while(flag) { //首先判断该年是否是闰年 if(Is_Special_Year(temp_year)) { if(is_temp_over_year<=366) { From_Year_Day_Date(temp_year,is_temp_over_year); flag=0; break; } else { is_temp_over_year =is_temp_over_year - 366; //年份加1 temp_year++; } } else { if(is_temp_over_year<=365) { From_Year_Day_Date(temp_year,is_temp_over_year); flag=0; break; } else { is_temp_over_year =is_temp_over_year - 365; //年份加1 temp_year++; } } } }
相关文章推荐
- SQL : 开始日期和结束日期,SQL找出中间的所有日期. 关于天数。
- Extjs2.2 开始时间,结束时间,工期 联动(选二补一),包含日期,天数的互转
- 开始日期到结束日期的天数和每天是星期几
- datetimebox输入开始结束日期,JS计算天数并赋值
- 新工作之初+问题:结束日期要大于开始日期+天数
- 给一个开始日期加上一个天数,计算结束日期
- sql 生成开始日期到结束日期与开始日期的相差天数
- 计算两日期相差天数(用字符串格式的时间形式来比较)、将时间戳转为字符串,开始到结束的时间差(用时间戳来比较)
- 计算从开始日期到结束日期经过的天数
- PHP 获取某年第几周的开始日期和结束日期
- java获取当前周的(开始日期-结束日期)和 当前月(开始日期-结束日期)
- PHP获取一年中的每星期的开始日期和结束日期
- 开始日期与结束日期(easyui的日期easyui-datebox)错误
- java Vector and 一周开始和结束日期和 传数组
- easyUI中使用datatimebox选定开始日期时间后自动带出7天之后的结束日期时间
- PHP获取一年中每个星期的开始和结束日期的方法
- php获取开始与结束日期之间所有日期的方法
- LayUI 开始日期到结束日期
- 通过SQL得到某年内每周的开始日期和结束日期
- jqGrid日期格式的判断示例代码(开始日期与结束日期)