日期 时间 模板

本文介绍了一个用于日期计算的C++程序实现,包括判断闰年、计算日期对应的天数、以及如何进行日期的前后推移等功能。

 最近准备蓝桥杯 总是遇到关于时间的 虽说乱凑总能凑出结果 但是还是决定整理一下 

先说一下要注意的东西,似乎没要注意的东西偷笑

我看到浙江大学ACM模板上有关于日期计算的  “性”高彩烈的去了,结果蛋碎一地,没看懂;

我写完了逗我同学 他说:“以后我也写一个”。我说:“以后,以后你都死了10 年了....” 哈哈开个玩笑进入正题

首先我们来写一个判断闰年的函数

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

不对上面还不是首先 上面是次先 下面来个首先啊

struct Date
{
	int year,month,day;
};

这个不多说 你的英语比我好;对了在这特别强调一下就是我的英语,下面所有函数的名称均是我有有道词典乱凑的

含义问题请找有道讨回公道;

还有就是月份数组

int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int dayss[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};


下面是一个计算天数的函数:

int datesum(Date x)
{
	int sum=(x.year-1)*365+(x.year-1)/4;//这个是我从别地方学的 我感觉很巧妙,就拿过来了 
	for(int i=1;i<x.month;i++)
	{
		sum+=days[i];
	}
	if(x.month>2&&leap(x.year))  //如果这一年是闰年的话 并且月份超过2月的话就+1天
	{
		sum=sum+1; 
	}
	sum+=x.day;
	return sum; 
} 

上面是计算这个时间一共是多少天 首先每年*363天 4年一次闰年 year/4就求出了过去多少个闰年了 然后加上


后面的都好理解 就是加上相应的月份 和天数;



下面再来说一下日期向前向后推移的问题  

先说一下向前推移的吧

Date dateforward(int x,Date s)
{
	int sum=datesum(s);
	sum-=x;
	s=date(sum,1);
	return s;
}

大体的思路就是先算出距离1年1月0日多少天,这里这个0 就是个标志 ;

然后减去向前推的日期 最后在你又上面的date函数推回去 ;你推我呀,我推你,一下我就推死你。

向前推的函数

Date datebackward(int x,Date s)
{
	for(int i=1;i<s.month;i++)
	{
		x=x+days[i];
	}
	if(s.month>2&&leap(s.year))
	{
		x+=1;
	}
	x+=s.day;
	s=date(x,s.year);
	return s;
}


这个也不用过多的解释跟上面的思路一样  ;


#include<iostream>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int dayss[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
struct Date
{
	int year,month,day;
};
//判断闰年
bool leap(int year)
{
	return (year%400==0||year%100!=0&&year%4==0);
} 
//计算天数 
int datesum(Date x)
{
	int sum=(x.year-1)*365+(x.year-1)/4;
	for(int i=1;i<x.month;i++)
	{
		sum+=days[i];
	}
	if(x.month>2&&leap(x.year))
	{
		sum=sum+1; 
	}
	sum+=x.day;
	return sum; 
} 
//从第year年开始 1月1日开始的x天后是哪一天
Date date(int x,int year)
{
	x=x+1;
	while(x>365)
	{
		if(leap(year))
			x=x-366;
		else
			x-=365;
		year++;
	}
	Date s;
	if(x==0)
	{
		s.year=year-1;
		s.month=12;
		s.day=31;
		return s;
	}
	s.year=year;
	if(leap(year))
	{
		for(int i=1;i<13;i++)
		{
			s.month=i;
			if(x>dayss[i])	x-=dayss[i];
			else { s.day=x;break;	}
		}
	}
	else
	{
		for(int i=1;i<13;i++) 
		{
			s.month=i;
			if(x>days[i])
				x-=days[i];
			else {s.day=x;break;}
		}
	}
	return s;
}
//计算日期 向后推移
Date datebackward(int x,Date s)
{
	for(int i=1;i<s.month;i++)
	{
		x=x+days[i];
	}
	if(s.month>2&&leap(s.year))
	{
		x+=1;
	}
	x+=s.day;
	s=date(x,s.year);
	return s;
}
//日期计算向前推移
Date dateforward(int x,Date s)
{
	int sum=datesum(s);
	sum-=x;
	s=date(sum,1);
	return s;
}
int main()
{
	//
}


写到这感谢我自己 , 感谢你们能过读到这里 有什么不明白的可以给我留言 ;

这个题没有经过online judge的习题洗礼 ,只是我的想法 如果过哪里错了希望大家指正;

“啊,当你悲伤的时候抬头仰望那包容了一万年风霜雨雪的天空,怎能不让人顶礼膜拜!”

这是高中时背的作文 依然风骚霸道!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值