日期计算器---日期相减、日期加天数、日期减天数_日期减去天数等于日期公式_猿来如此~的博客-程序员秘密

技术标签: C++学习  

日期相减

int Date::Num( Date & d)
{
	Date res = *this;
	uint tmp;
	uint src, m1 = 0, m2 = 0, n1 = 0, n2 = 0;
	if (res > (d))
	{
		if (res.m_year == d.m_year)
		{
			if (res.m_month == d.m_month)
			{
				return (res.m_day - d.m_day);
			}
			else
			{
				while (d.m_month < res.m_month)
				{
					tmp = getMonthDay(d.m_year, d.m_month);
					m1 += tmp;
					d.m_month++;
				}
				return m1 + (unsigned int)(res.m_day - d.m_day);
			}
		}
		else
		{
			src = getLeapNum(d.m_year, res.m_year);//src里面存放的是d到res之间的闰年的个数
			n1 = (res.m_year - d.m_year) * 365 + src;//这时的n存放的是将相差的年数转换为天数,然后剩下的部分就转换成了上面的那个情况
			d.m_year = res.m_year;
			while (d.m_month < res.m_month)
			{
				tmp = getMonthDay(d.m_year, d.m_month);
				m1 += tmp;
				d.m_month++;
			}
			return n1 + m1 + (unsigned int)(res.m_day - d.m_day);
		}
	}
	else if (res == (d))
	{
		return 0;
	}
	else
	{
		if (res.m_year == d.m_year)
		{
			if (res.m_month == d.m_month)
			{
				return (d.m_day - res.m_day);
			}
			else
			{
				while (d.m_month > res.m_month)
				{
					tmp = getMonthDay(res.m_year, res.m_month);
					m2 += tmp;
					res.m_month++;
				}
				return m2 + (unsigned int)(d.m_day - res.m_day);
			}
		}
		else
		{
			src = getLeapNum(d.m_year, res.m_year);//src里面存放的是d到res之间的闰年的个数
			n2 = (d.m_day - res.m_day) * 365 + src;//这时的n存放的是将相差的年数转换为天数,然后剩下的部分就转换成了上面的那个情况
			res.m_year = d.m_year;
			while (d.m_month > res.m_month)
			{
				tmp = getMonthDay(res.m_year, res.m_month);
				m2 += tmp;
				res.m_month++;
			}
			return n2 + m2 + (unsigned int)(d.m_day - res.m_day);
		}
	}
}

日期加天数

Date Date::operator +(uint delay) const
{
	Date res = *this;
	uint tmp;
	tmp = getMonthDay(res.m_year, res.m_month);//tmp里面保存的是当月的总天数
	while (delay >= tmp)//如果所加的天数大于当月的总天数
	{
		delay -= tmp;//用要加的天数减去当月数
		res.m_month++;//并且月份加1,相当于加了一个整月
		if (res.m_month > 12)//如果加的月份大于12月之后
		{
			res.m_month = 1;//就将月份置为1
			res.m_year++;//年份+1,到第二年
		}
		tmp = getMonthDay(res.m_year, res.m_month);//这个时候再次计算现在这个月的总天数
	}
	//上面的while循环结束后,所加的天数已经不足以减去整月的天数

	res.m_day += delay;//将剩下的天数加到这个月的日期中
	if (res.m_day > tmp)//如果此时加上的这个天数大于本月的总天数的话
	{
		res.m_month++;//就将月份继续加1
		if (res.m_month > 12)//并且判断月份大于12月
		{
			res.m_month = 1;
			res.m_year++;
		}
		res.m_day -= tmp;//给现在的天数减去上个月的总天数,就是这个月的天数
	}
	return res;
}

日期减天数

Date Date::operator -(uint delay) const
{
	Date res = *this;
	uint tmp;
	tmp = getMonthDay(res.m_year, res.m_month);
	while (delay >= tmp)
	{
		delay -= tmp;
		res.m_month--;
		if (res.m_month < 1)
		{
			res.m_month = 12;
			res.m_year--;
		}
		tmp = getMonthDay(res.m_year, res.m_month);
	}

	res.m_day -= delay;
	if (res.m_day <= 0)
	{
		res.m_month--;
		if (res.m_month < 1)
		{
			res.m_month = 12;
			res.m_year--;
			
		}
		tmp = getMonthDay(res.m_year, res.m_month);
		res.m_day += tmp;
	}
	return res;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44783220/article/details/100655568

智能推荐

ABAP 写数据到SAP服务器文件并读取_山旮旯hjz的博客-程序员秘密

一、在应用服务器中打开文件OPEN  DATASET    [options] 此语句打开文件 。如果不指定任何模式 选项,则文件将按二进 制模式打开。如果系统不能打开文件,则将系统字段 SY-SUBRC 设置为 8,否则 SY-SUBRC 返回 0二、打开文件读取OPEN DATASET FOR INPUT IN TEXT MODE ENCODING DEFAULT .(以TXT文件打开

C语言基础06-从键盘输入数据_木笪的博客-程序员秘密

今天我要说的是scanf() 输入函数 ,scanf()是最灵活、最复杂、最常用的输出函数,但它不能完全取代其他的函数。scanf() 和printf() 类似,scanf()可以输入多种类似的数据,而getchar()、getche()、getch() 这三个函数都用于输入单个字符,gets()可以获取一行数据,并作为字符串处理。一、scanf() 输入函数我们先来举个例子:#incl...

PL/SQL中导出整个表、表结构、部分数据、以及导入整个表_plsql导出表结构_王潮潮的博客-程序员秘密

功能描述:将PL/SQL中查询到的需要的数据进行导出实现方法:一、 第一步,首先确定好需要查询的表,以及查询表中数据的条件。例如:想查询一个表中前5条数据 代码如下: select * from tbl where rownum&lt;=5;二、第二步,将查询到的数据进行导出三、第三步,选择需要导出的数据的文件类型四、第四步,将导出数据的表结构也进行导出五、第五步,完成导出...

差分晶振LVDS、LVPECL、HCSL、CML不同信号模式介绍_hcsl转lvds_超炫拉风的博客-程序员秘密

关键词标签: 差分晶振,差分时钟,差分信号导读:本应用笔记详细说明如何通过在它们之间增加衰减电阻和偏置电路来将一个差分时钟转换为其他类型的差分逻辑,来衰减摆幅电平并重新偏置共模输入接收器。介绍考虑到每个可用的时钟逻辑类型(LVPECL、HCSL、CML和LVDS)使用的共模电压和摆幅电平低于下一个时钟逻辑类型(见表1),在任何给定的系统设计中,必须设计驱动器侧和接收器侧之间的时钟逻辑转换。本...

MTK 功能机 MMI绘画_mtk功能机mmi_我如果有梦的博客-程序员秘密

MMI绘画MMI架构及基础知识MMI全称Man Macheine Interface(人机接口或人机界面)。人机界面分为文件界面(如DOS)和图形界面(如Windows)两种类型,功能机的平台属于简单的图形界面。下图为我们MMI简洁架构图 最上层的Application Layer在MMI基础中已经详细介绍,我们通常要做的也就是这一层的开发。Application Layer往下就是平台的图形子系

curl 设置超时时间_weixin_30745553的博客-程序员秘密

使用CURL时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间。连接超时时间用--connect-timeout参数来指定,数据传输的最大允许时间用-m参数来指定。curl --connect-timeout 10 -m 20 "http://XXXXXXX"连接超时的话,出错提示形如:curl: (28) connect() timed out...

随便推点

Tomcate三种部署项目的方法_HSoson的博客-程序员秘密

在tomcat中三种部署项目的方法第一种方法:在tomcat中的conf目录中,在server.xml中的,节点中添加:loWebRoot" debug="0"privileged="true" reloadable="true">reloadable="true"文件有变化会自动加载至于Context 节点属性,可详细见相关文档。第二种方法:将web项

mix+php,创建命令 · MixPHP V1 开发指南 · 看云_此号已死的博客-程序员秘密

## 创建命令命令就是一个命令行程序,`Command` 类似于 HTTP 应用的 `Controller` 控制器,负责业务逻辑,不同的是命令行程序通常是处理复杂的数据处理逻辑,相比简单的 `CRUD` 操作要复杂很多。| 类 || --- || mix\console\Command |&gt;[info] 初始代码中命令行应用的命令在 commands 目录。## 一个简单的命令首先...

C++类成员冒号初始化以及构造函数内赋值_c++在主函数为类内赋值_zj510的博客-程序员秘密

通常我们对类成员进行“初始化”有两种方式:1. 构造函数后面跟冒号;2. 构造函数里面对成员进行赋值。有些人不太注意这个小细节,或者根本不知道他们的区别,认为两种方式是一样的。这个误解有时可能会对程序带来影响,这里我来介绍一下这两种方式。首先我们看这么一段代码:class A{public: A(int& c) { _a = 1; }protected: in

PortAudio库环境搭建_c++ portaudio采集麦克风_yvhvv的博客-程序员秘密

在qt creator中,我用openCV捕获摄像头的帧,并把结合了高斯平滑和微分求导离散微分算子sobel 应用在每帧图像上,看着屏幕中,那实时的用黑底白色线条勾勒出来的自己,感觉好好玩,感觉openCV好强大,可惜我没找到它捕获麦克风的功能,既然媒体I/O模块可以处理视频,既然封装了DirectShow的摄像头捕获功能,openCV可真够视觉库的,视觉得也太彻底了点吧!不过

如何手动完成一次APK打包?----APK编译全过程_Omni-Space的博客-程序员秘密

身为一个Android工程师,你是否有考虑过一个Android项目工程如何经过编译压缩变成一个APK的呢?你又是否编写过打包工具完成多渠道打包呢?下面我们来解密如何完成一个APK的打包。1、使用Android SDK提供的aapt.exe生成R.java类文件2、使用Android SDK提供的aidl.exe把.aidl转成.java文件(如果没有aidl,则跳过这一步)3、...

推荐文章

热门文章

相关标签