设置头文件和宏定义:
#include<stdio.h>
#include<math.h>
#define _CRT_SECURE_NO_WARNINGS
首先需要写一些辅助函数:
int date_current_days(int year, int month, int day);//计算某日期在该日期所在年份的天数
int date_differ(int year1, int month1, int day1, int year2, int month2, int day2);//计算两日期之间的天数之差
int date_from_1970(int year, int month, int day);//某日期距离1970年1月1日的天数
int if_leap_year(int year);//判断是否闰年
int judge_week(int year, int month, int day);//判断该日期是的星期
辅助函数实现:
int date_current_days(int year, int month, int day) {
//1970年1月1日为星期四,闰年有366天,2月有29天,正常年份2月有28天
int arr[2][12] = { 31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31 };//第一行非闰年,第二行闰年
int ret=0;//用来记录总数
int flag = 0;//默认0是非闰年,1是闰年
//先判断这一年是否是闰年
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
flag = 1;//闰年情况
}
for (int i = 0; i < month - 1; i++) {
ret += arr[flag][i];
}
ret += day;
return ret;
}
int if_leap_year(int year) {
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
return 1;//闰年情况
}
return 0;
}
int date_from_1970(int year, int month, int day) {
int ret = 0;
for (int i = 1970; i < year; i++) {
if (if_leap_year(year)) {
ret += 366;
}
else {
ret += 365;
}
}
ret += date_current_days(year, month, day)-1;
return ret;
}
int date_differ(int year1, int month1, int day1, int year2, int month2, int day2) {
return abs(date_from_1970(year1, month1, day1) - date_from_1970(year2, month2, day2));
}
int judge_week(int year, int month, int day) {
int ret = date_from_1970(year, month, day);
ret = (3 + ret % 7) % 7;
if ( ret== 0) {
ret += 7;
}
return ret;
}
借助辅助函数实现对某日期过n天后日期和星期的计算:
void input_date_week(int year, int month, int day, int n) {
int flag = 0;//表示非闰年
int arr[2][12] = { 31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31 };//第一行非闰年,第二行闰年
int year_new, month_new, day_new, n_new;
year_new = year;
month_new = month;
day_new = day;
n_new = n;
if (date_current_days(year_new, month_new, day_new) + n > 365 + if_leap_year(year_new)) {
//所加天数导致超过当前年份
n_new = n_new - (365 + if_leap_year(year_new) - date_current_days(year_new, month_new, day_new)) - 1;//这里要注意减1
year_new++;
month_new = 1;
day_new = 1;
while (n_new - 365 - if_leap_year(year_new) > 0) {
n_new = n_new - 365 - if_leap_year(year_new);
year_new++;
}
}
flag = if_leap_year(year_new);
if (day_new + n > arr[flag][month_new-1]) {
//所加天数超过当前月份
n_new = n_new - (arr[flag][month_new - 1] - day_new)-1;//这里要注意减1
month_new++;
day_new = 1;
}
while (n_new - arr[flag][month_new - 1]>0) {
n_new = n_new - arr[flag][month_new - 1];
month_new++;
}
day_new += n_new;
printf("%d年%d月%d日经过%d天后是%d年%d月%d日,星期%d\n", year, month, day, n, year_new, month_new, day_new,judge_week(year_new,month_new,day_new));
}
主函数测试:
int main() {
int year1, month1, day1, year2, month2, day2, ret;
printf("请输入第一个日期:\n");
scanf("%d%d%d", &year1, &month1, &day1);
printf("请输入第二个日期:\n");
scanf("%d%d%d", &year2, &month2, &day2);
ret = date_current_days(year1, month1, day1);
input_date_week(year1, month1, day1, 15);
input_date_week(year1, month1, day1, 25);
input_date_week(year1, month1, day1, 365);
printf("%d年%d月%d日是当年的第%d天\n",year1,month1,day1,ret);
printf("%d年%d月%d日和%d年%d月%d日相差%d天\n",year1,month1,day1, year2, month2, day2, date_differ(year1, month1, day1, year2, month2, day2));
printf("%d年%d月%d日是星期%d\n", year1, month1, day1, judge_week(year1,month1,day1));
printf("%d年%d月%d日是星期%d\n", year2, month2, day2, judge_week(year2, month2, day2));
return 0;
}
输出: