日期函数之计算两个日期之间的天数差

发布于:2024-05-08 ⋅ 阅读:(31) ⋅ 点赞:(0)

开篇

本体来源为《编程珠玑》第3章课后习题4的第一问。

问题概要

给定两个日期,计算两者之间的天数。

思路分析

以2022年1月22号和2024年2月3号为例:

  1. 首先根据年月日确定2022年1月22号是2022年的第22天,距离2023年还差(365 - 22 = 341)天(这里需要确定是否是闰年还是平年,以确定是365还是366
  2. 2024年2月3号是2024年的第34天
  3. 两个年月日的差即为: 341 + 365(2023年的天数) + 34
    综上:主要需要的函数有:
    判断是否是闰年isLeapYear();
    根据年月日计算出属于当前年的第多少天cntDays();
    还需要求出两个年份之间的年份,然后根据是否是平年还是闰年,在和上加上365或者366

代码实现

#include <stdio.h>

// 判断是否是闰年
int isLeapYear(int year) {
	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 计算当前日期是当年的第几天
int cntDays(int year, int month, int day) {
	int days = 0;
	int days_in_month[] = { 31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	for (int i = 0; i < month - 1; ++i) {
		days += days_in_month[i];
	}
	days += day;

	return days;
}

// 计算两个日期之间的天数差
int daysBetweenDates(int y1, int m1, int d1, int y2, int m2, int d2) {
	int days = 0;
	// 计算第一个日期距离年底的天数
	days += isLeapYear(y1) ? 366 - cntDays(y1, m1, d1) : 365 - cntDays(y1, m1, d1);
	// 计算中间年份的天数
	for (int y = y1 + 1; y < y2; y++) {
		days += isLeapYear(y) ? 366 : 365;
	}
	// 计算第二个日期距离当年年初的天数
	days += cntDays(y2, m2, d2);

	return days;
}

int main() {
	int y1, m1, d1;
	int y2, m2, d2;

	// 用户输入两个日期
	printf("请输入第一个日期(YYYY MM DD): ");
	scanf_s("%d %d %d", &y1, &m1, &d1);
	printf("请输入第二个日期(YYYY MM DD): ");
	scanf_s("%d %d %d", &y2, &m2, &d2);

	// 计算两个日期的天数之差,并输出
	int daysDiff = daysBetweenDates(y1, m1, d1, y2, m2, d2);
	printf("天数之差为: %d\n", daysDiff);

	return 0;
}

啊哈哈,感觉这篇文章有点水,当作是日常记录的一个证明吧w


网站公告

今日签到

点亮在社区的每一天
去签到