2 qq 34174865 qq_34174865 于 2016.03.23 14:12 提问

源代码去下,用来计算两个日期之间的时间。但是运行特别慢。求大神优化,能让它运行快点

#include
using namespace std;
const int lmonth[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
//闰年每个月份的时间
const int umonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//非闰年每个月份的时间,定义符合使用习惯
bool isLeapYear(int year);
class Date
{
private:
int m_year;
int m_month;
int m_day;
public:
Date(int year=2016,int month=3,int day=23);
Date(Date&b);
Date operator+(int days);
Date operator-(int days);
int operator-(Date &b);
friend bool operator>(Date &a,Date &b);
friend ostream& operator <<(ostream& out,Date &b);
friend istream& operator >>(istream&in,Date &b);
friend bool operator!=(Date &a,Date &b);
};
int main()
{
Date date1,date2,date3;
//测试日期相减
cout<<"请依次输入日期1的年月日:(请输入正确日期!)"< cin>>date1;
cout<<"请依次输入日期2的年月日:(请输入正确日期!)"< cin>>date2;
cout< cout int t;
cin>>t;
//测试日期加一天减一天
cout< cout return 0;
}
inline bool isLeapYear(int year)
{
if(year%4==0&&year%100!=0)
return true;
else if(year%400==0)
return true;
else
return false;
}
//构造函数
Date::Date(int year,int month,int day)
{
m_year=year;
m_month=month;
m_day=day;
}
//拷贝构造函数
Date::Date(Date&b)
{
m_year=b.m_year;
m_month=b.m_month;
m_day=b.m_day;
}
//重载>
bool operator>(Date &a,Date &b)
{
if(a.m_year>b.m_year)
return true;
else if(a.m_month>b.m_month)
return true ;
else if(a.m_day>b.m_day)
return true;
else
return false;
}
//无副作用的+-
Date Date::operator+(int days)
{
Date tmp=*this;//目的是无副作用
tmp.m_day=tmp.m_day+days;
loop1:while((tmp.m_day>lmonth[tmp.m_month])&&isLeapYear(tmp.m_year))
{
tmp.m_day-=lmonth[tmp.m_month];//闰年加上闰年的月份
if(tmp.m_month==12)//每12月进一年
{
tmp.m_month=1;
tmp.m_year++;
}
else
tmp.m_month++;
}
//平年加上平年的月份
while((tmp.m_day>umonth[tmp.m_month])&&!isLeapYear(tmp.m_year))
{
tmp.m_day-=umonth[tmp.m_month];
if(tmp.m_month==12)
{
tmp.m_month=1;
tmp.m_year++;

}
else
tmp.m_month++;
goto loop1;
}
return tmp;
}
Date Date::operator-(int days)
{
Date tmp=*this;
tmp.m_day-=days;
loop2:while(tmp.m_day<=0&&isLeapYear(tmp.m_year))
{
tmp.m_day+=lmonth[tmp.m_month];
if(tmp.m_month==1)
{
tmp.m_month=12;
tmp.m_year--;
}
else
tmp.m_month--;
}
while(tmp.m_day<=0&&!isLeapYear(tmp.m_year))
{
tmp.m_day+=umonth[tmp.m_month];
if(tmp.m_month==1)
{
tmp.m_month=12;
tmp.m_year--;
}
else
tmp.m_month--;
goto loop2;
}
return tmp;
}
int Date::operator-(Date &b)
{
int days=0;
if(*this>b)
{
for(int y=b.m_year;y<=m_year;y++)
if(isLeapYear(y))
days+=366;
else
days+=365;
if(isLeapYear(m_year)
{
days+=366;
for(int m=m_month;m<=12;m++)//thisyear还没过
days-=lmonth[m];
days+=m_day;
}
else
{
days+=365;
for(int m=m_month;m<=12;m++)
days-=umonth[m];
days+=m_day;
}
if(isLeapYear(b.m_year)//h
{
days+=366;
for(int m=1;m<=b.m_month;m++)//thisyear还没过
days-=lmonth[m];
days+=(lmonth(b.m_month)-b.m_day);
}
else
{
days+=365;
for(int m=1;m<=b.m_month;m++)//thisyear还没过
days-=umonth[m];
days+=(umonth(b.m_month)-b.m_day);
}
}
else
{
for(int y=m_year;y<=b.m_year;y++)
if(isLeapYear(y))
days+=366;
else
days+=365;
if(isLeapYear(b.m_year)
{
days+=366;
for(int m=b.m_month;m<=12;m++)//thisyear还没过
days-=lmonth[m];
days+=b.m_day;
}
else
{
days+=365;
for(int m=b.m_month;m<=12;m++)
days-=umonth[m];
days+=b.m_day;
}
if(isLeapYear(m_year)//h
{
days+=366;
for(int m=1;m<=m_month;m++)//thisyear还没过
days-=lmonth[m];
days+=(lmonth(m_month)-m_day);
}
else
{
days+=365;
for(int m=1;m<=m_month;m++)//thisyear还没过
days-=umonth[m];
days+=(umonth(m_month)-m_day);
}
}
}
//实现自定义输出
ostream& operator <<(ostream& out,Date &b)
{
cout< return out;
}
//实现自定义输入
istream& operator >>(istream&in,Date &b)
{
cin>>b.m_year>>b.m_month>>b.m_day;
return in;
}
//重定义!=
bool operator!=(Date &a,Date &b)
{
if(a.m_month==b.m_month&&a.m_year==b.m_year&&a.m_day==b.m_day)
return false;
else
return true;
}

2个回答

sl_18500
sl_18500   2016.03.23 14:25

这么复杂,都不想看
计算两个日期间的时间,你可以将两个日期转换为时间戳,然后相减,在转为天、小时
这样不是好点么

IT_163
IT_163   2016.03.23 14:28

这么复杂,都不想看
计算两个日期间的时间,你可以将两个日期转换为时间戳,然后相减,在转为天、小时
这样不是好点么

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
oracle计算两个日期之间时间差值sql
sql Server中有函数DATEDIFF能够比较方便的计算出两个时间点之间的时间差值,但是oracle就没有,需要自己写方法计算,这是比较坑爹的。 自己写了个分享一下 create or replace function datediff(type in varchar2, startTime in varchar2,endTime in varchar2,v in varchar2) r
怎么计算两个日期之间的差值
写程序时会遇到比较两个日期之间的差值,差了多少天,或者其他什么,于是自己写了一个方法,供大家参考,也作为自己的备份吧。 日期之间的差值:差了多少天 function DateDiff(sDate1, sDate2){ //sDate1和sDate2是2006-12-18格式 var aDate, oDate1, oDate2, iDays
Java 计算两个日期之间的天数
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class test3 { /** * @param args * @throws ParseException
c# 计算两个日期之间相差的天数
C#中两个日期之间的间隔天数 sql中这样取,select DateDiff("dd",joindatetime,getdate()) from db    那么在c#中呢 //C#中使用TimeSpan计算两个时间的差值 //可以反加两个日期之间任何一个时间单位。 private string DateDiff(DateTime DateTime1, DateTime Dat
Java8 实现计算两个日期之间的天数
这几天给项目组同事做代码评审,刚好看到一段求两个日期之间的天数,看完后觉得写的太复杂(采用获取两个日期的毫秒数,相减后再除以一天的毫秒数得到天数),刚好项目用的是java8,就想到用java8 新的Java日期/时间API 实现一个更加简洁的方法
JavaScript计算两个日期之间相差的天数
写一个JavaScript的函数用于计算两个日期字符串之间相差的天数,首先求出两个日期之间相差的毫秒数,然后除以一天的毫秒数 //获得两个日期之间相差的天数 function getDays(date1 , date2){ var date1Str = date1.split("-");//将日期字符串分隔为数组,数组元素分别为年.月.日 //根据年 . 月 . 日的值创建Dat
经典算法:计算两个日期之间的天数
如题所示,这个算法就是写起来麻烦一点,不过还是很简单的,思路清晰就非常好做思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为num1[] 和 num2[]; **然后就是先计算年和年之间的差距{ 相距一年:为第一年的剩下日子+第二年开始的日子 相距一年以上:为初始年的剩下日子+末尾年开始
输入两个日期,使用Calendar来表示时间,并计算两个日期之间相隔的天数
題目內容: 输入两个日期,使用Calendar来表示时间,并计算两个日期之间相隔的天数 输入输出说明: 输入: 2017 4 13 2017 4 15 输出: 2 import java.util.Calendar; import java.util.Scanner; public class Main{ public static void ma
计算两个日期之间相差的月数
/** *//**     * 计算两个日期之间相差的月数     * @param strDate1     * @param strDate2     * @return     */    public static int dispersionMonth2(String strDate1, String strDate2) ...{        int iMonth = 0;    
php编程---使用计算两个日期之间的天数
<?php /** * 求两个日期之间相差的天数 * (针对1970年1月1日之后) * @param string $day1 * @param string $day2 * @return int */ function diffTwoDate(string $date1, string $date2) { $timestamp1 = strtotime($date1);