C语言计算两个日期之间的天数
以下是一个完整的C语言程序,用于计算两个日期之间的天数差,这个程序考虑了闰年情况,并且可以处理任意两个有效的日期。
#include <stdio.h>
#include <stdbool.h>
// 判断是否为闰年
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 获取某个月的天数
int daysInMonth(int month, int year) {
static const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && isLeapYear(year)) {
return 29;
}
return days[month - 1];
}
// 计算从公元1年1月1日到给定日期的总天数
int dateToDays(int day, int month, int year) {
int totalDays = 0;
// 计算完整年份的天数
for (int y = 1; y < year; y++) {
totalDays += isLeapYear(y) ? 366 : 365;
}
// 计算当年完整月份的天数
for (int m = 1; m < month; m++) {
totalDays += daysInMonth(m, year);
}
// 加上当月的天数
totalDays += day;
return totalDays;
}
// 计算两个日期之间的天数差
int daysBetweenDates(int day1, int month1, int year1,
int day2, int month2, int year2) {
int days1 = dateToDays(day1, month1, year1);
int days2 = dateToDays(day2, month2, year2);
return days2 - days1;
}
int main() {
int day1, month1, year1;
int day2, month2, year2;
printf("请输入第一个日期(日 月 年): ");
scanf("%d %d %d", &day1, &month1, &year1);
printf("请输入第二个日期(日 月 年): ");
scanf("%d %d %d", &day2, &month2, &year2);
// 验证日期有效性
if (day1 < 1 || day1 > daysInMonth(month1, year1) ||
month1 < 1 || month1 > 12 ||
year1 < 1) {
printf("第一个日期无效!\n");
return 1;
}
if (day2 < 1 || day2 > daysInMonth(month2, year2) ||
month2 < 1 || month2 > 12 ||
year2 < 1) {
printf("第二个日期无效!\n");
return 1;
}
int days = daysBetweenDates(day1, month1, year1, day2, month2, year2);
printf("从 %d-%02d-%02d 到 %d-%02d-%02d 的天数差是: %d 天\n",
year1, month1, day1, year2, month2, day2, days);
return 0;
}
程序说明
- isLeapYear函数:判断给定年份是否为闰年
- daysInMonth函数:返回给定月份的天数,考虑闰年2月的情况
- dateToDays函数:将日期转换为从公元1年1月1日开始的天数
- daysBetweenDates函数:计算两个日期之间的天数差
- main函数:获取用户输入,验证日期有效性,并计算结果
使用示例
请输入第一个日期(日 月 年): 1 1 2025
请输入第二个日期(日 月 年): 1 1 2025
从 2025-01-01 到 2025-01-01 的天数差是: 366 天
请输入第一个日期(日 月 年): 15 6 2025
请输入第二个日期(日 月 年): 25 12 2025
从 2025-06-15 到 2025-12-25 的天数差是: 193 天
这个程序可以正确处理闰年、不同月份的天数差异,并且可以计算任意两个有效日期之间的天数差。
