0
点赞
收藏
分享

微信扫一扫

C计算某日期过n天后的日期和星期

诗尚凝寒 2022-02-19 阅读 104
c语言

设置头文件和宏定义:

#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;
}

输出:

 

举报

相关推荐

0 条评论