C++计算任意两个日期天数差的方法详解

 更新时间:2024年02月04日 09:39:23   作者:polokalamu  
这篇文章主要为大家详细介绍了如何利用C++实现任意两个日期天数差,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下

1.思路

这个问题有三种情况:同年同月、同年不同月、不同年。

同年同月非常容易,较难解决的是后两个。

思路为下:

1.计算日期在前的一年到年底的天数

2.计算日期在后的一年到年初的天数

3.计算中间年份的天数

以上为解决不同年的思路。

同年不同月的思路整体差不多,也是计算前一个月到月底的天数、后一个月到月初的天数、中间月份的天数。

2.代码实现

我建立了三个函数:months1–计算到年底的天数差,months2–计算到年初的天数差,years1–计算两年之间的天数差。还有一个就是闰年判断函数lapeyear,用来判断一年中的二月有没有29天。

int months1(int year, int month, int date)//计算到年底日差的函数
{
    int i, d = 0;
    int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    if (lapeyear(year))years[1] = 29;
    for (i = 11; i > month - 1; i--)
    {
        d += years[i];
    }
    d = d + years[month - 1] - date;
    return d;
}
int months2(int year, int month, int date)//计算到年初日差的函数
{
    int i, d = 0;
    int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    if (lapeyear(year))years[1] = 29;
    for (i = 0; i < month - 1; i++)
    {
        d += years[i];
    }
    d += date;
    return d;
}
int years1(int year1, int year2)//计算两年间的天数
{
    int d = 0, i, r = 0, z = 0;
    if (year1 < year2)
    {
        for (i = year1 + 1; i < year2; i++)
        {
            if (lapeyear(i))r++;//两年之间有多少个闰月
        }
        d = (year2 - year1 - 1) * 365 + r;
    }
    else
    {
        for (i = year2 + 1; i < year1; i++)
        {
            if (lapeyear(i))r++;//两年之间有多少个闰月
        }
        d = (year1 - year2 - 1) * 365 + r;
    }
    return d;
}

3.完整代码

以下为全部的代码

#include<iostream>
using namespace std;
int lapeyear(int year2)//闰年判断函数
{
	if ((year2 % 400 == 0) || (year2 % 4 == 0 && year2 % 100 != 0))
		return 1;
	else return 0;
}
int years1(int year1, int year2)//计算两年间的天数
{
	int d = 0, i, r = 0, z = 0;
	if (year1 < year2)
	{
		for (i = year1 + 1; i < year2; i++)
		{
			if (lapeyear(i))r++;//两年之间有多少个闰月
		}
		d = (year2 - year1 - 1) * 365 + r;
	}
	else
	{
		for (i = year2 + 1; i < year1; i++)
		{
			if (lapeyear(i))r++;//两年之间有多少个闰月
		}
		d = (year1 - year2 - 1) * 365 + r;
	}
	return d;
}
int months2(int year, int month, int date)//计算到年初日差的函数
{
	int i, d = 0;
	int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	if (lapeyear(year))years[1] = 29;
	for (i = 0; i < month - 1; i++)
	{
		d += years[i];
	}
	d += date;
	return d;
}
int months1(int year, int month, int date)//计算到年底日差的函数
{
	int i, d = 0;
	int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	if (lapeyear(year))years[1] = 29;
	for (i = 11; i > month - 1; i--)
	{
		d += years[i];
	}
	d = d + years[month - 1] - date;
	return d;
}
int main()
{
	int year1, year2, month1, month2, date1, date2;
	int d = 0, i, m = 0;
	int x1, x2;//记录两个日期分别到年初和年底的天数
	int years[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	cout << "请输入两个日期" << endl;
	cin >> year1 >> month1 >> date1 >> year2 >> month2 >> date2;
	if (year1 == year2)//大前提,同年时
	{
		if (lapeyear(year1))years[1] = 29;
		if (month1 == month2)d = date1 > date2 ? date1 - date2 : d = date2 - date1;//同年同月
		if (month1 != month2)//同年不同月
		{
			//计算方法为求出两月之前的天数,然后求前一个月剩余的天数和后一个月已经开始的天数
			if (month1 < month2)
			{
				{
					for (i = month1; i < month2 - 1; i++)
					{
						m += years[i];
					}
				}
				d = years[month1 - 1] - date1;
				d += m + date2;
			}
			else
			{
					for (i = month2; i > month1 - 1; i++)
					{
						m += years[i];
		            }
				d = years[month2 - 1] - date2;
				d += m + date1;
			}
		}
	}
	else//求不同年的任意日期的天数差
	{
		if (year1 > year2)
		{
			x1 = months1(year2, month2, date2);//x1为到年底的日差,x2为到年初的日差
			x2 = months2(year1, month1, date1);
			d = years1(year2, year1);
			d += x1 + x2;
		}
		else
		{
			x2 = months2(year2, month2, date2);
			x1 = months1(year1, month1, date1);
			d = years1(year1, year2);
			d += x1 + x2;
		}

	}
	cout << "两年之间的天数差为" << " " << d;
	return 0;
}

到此这篇关于C++计算任意两个日期天数差的方法详解的文章就介绍到这了,更多相关C++计算日期天数差内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++中如何实现回调的方法示例

    C++中如何实现回调的方法示例

    这篇文章主要给大家介绍了关于C++中如何实现回调的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • C语言详解结构体的内存对齐与大小计算

    C语言详解结构体的内存对齐与大小计算

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐与计算大小
    2022-04-04
  • C语言实现基于最大堆和最小堆的堆排序算法示例

    C语言实现基于最大堆和最小堆的堆排序算法示例

    这篇文章主要介绍了C语言实现基于最大堆和最小堆的堆排序算法示例,分别是基于最大堆的升序排序和基于最小堆的降序排序实例,需要的朋友可以参考下
    2016-06-06
  • 用C++实现SLR语法分析程序

    用C++实现SLR语法分析程序

    大家好,本篇文章主要讲的是用C++实现SLR语法分析程序,感兴趣的同学赶紧来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言高斯消元法的使用详解

    C语言高斯消元法的使用详解

    本篇文章是对C语言中高斯消元法的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++右值引用与move和forward函数的使用详解

    C++右值引用与move和forward函数的使用详解

    为了支持移动操作,新标准引入了一种新的引用类型——右值引用(rvalue reference)。所谓右值引用就是必须绑定到右值的引用,这篇文章主要介绍了C++右值引用与move和forward的使用
    2022-08-08
  • 马尔可夫链算法(markov算法)的awk、C++、C语言实现代码

    马尔可夫链算法(markov算法)的awk、C++、C语言实现代码

    这篇文章主要介绍了马尔可夫链算法(markov算法)的awk、C++、C语言实现代码,需要的朋友可以参考下
    2014-08-08
  • Qt QtCreator添加自定义注释的实现方法

    Qt QtCreator添加自定义注释的实现方法

    在写代码的时候我们为了规范化,一般会加文件注释、类注释和函数注释,本文主要介绍了Qt QtCreator添加自定义注释的实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • VC实现屏幕截词功能的方法详解

    VC实现屏幕截词功能的方法详解

    这篇文章主要介绍了VC实现屏幕截词功能的方法详解,对于深入的理解windows程序运行原理很有帮助,需要的朋友可以参考下
    2014-07-07
  • C语言使用mciSendString实现播放音乐功能

    C语言使用mciSendString实现播放音乐功能

    mciSendString 支持 mp3、wma、wav、mid 等多种媒体格式,使用非常简单。这篇文章就来为大家介绍一下C语言如何使用mciSendString实现播放音乐功能,需要的可以参考一下
    2023-02-02

最新评论