计算日期差
#include <iostream>
using namespace std;
struct date
{
int year;
int month;
int day;
};
bool isLeap(int aYear); // 判断平年闰年
int daysGone(date aDate); // 计算一年的第几天
int main()
{
int days(0);
int days1(0);
date a,b;
cout << "请输入第一个日期(年月日):";
cin >> a.year >> a.month >> a.day;
cout << "请输入第二个日期(年月日):";
cin >> b.year >> b.month >> b.day;
for (int i = a.year; i < b.year; i++)
{
if (isLeap(i))
days1 += 366;
else
days1 += 365;
}
days = days1 + daysGone(b)-daysGone(a);
cout << "两个日期间隔" << days << "天" << endl << endl;
return 0;
}
bool isLeap(int aYear)
{
if (((aYear % 4 == 0) && (aYear % 100 != 0)) || (aYear % 400 == 0))
return true;
else
return false;
}
int daysGone(date aDate)
{
int mDays(0);
if (aDate.month > 1)
for (int i = 1; i < aDate.month; i++)
if (i == 4 || i == 6 || i == 9 || i == 11)
mDays += 30;
else if (i == 2)
if (isLeap(aDate.year))
mDays += 29;
else
mDays += 28;
else
mDays += 31;
return mDays + aDate.day;
}
计算结果
请输入第一个日期(年月日):1985-8-9
请输入第二个日期(年月日):2017-8-9
两个日期间隔11688天
计算日期+天数=新日期
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
int normalMonthDays[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool leapYear(int year)
{//leap year judgement
if(year %4 ==0 && year%100 !=0 || year %400 ==0)
return true;
return false;
}
Date getNewDate(Date initDate, int diffDays)
{
Date reDate = initDate;
//1.get years (days >=366 or 365)
int daysAyear = 365;
if(leapYear(reDate.year))
{//if leap year
daysAyear = 366;
}
while(diffDays/daysAyear)
{
diffDays = diffDays - daysAyear;
reDate.year ++;
if(leapYear(reDate.year))
{
daysAyear = 366;
}
}
//2.get months (days < 366 or 365)
if(leapYear(reDate.year))
{
normalMonthDays[2]=29;
}
while(diffDays/normalMonthDays[reDate.month])
{
diffDays = diffDays - normalMonthDays[reDate.month];
reDate.month++;
if(reDate.month >= 13)
{
reDate.year++;
if(leapYear(reDate.year))
{
normalMonthDays[2]=29;
}
reDate.month = reDate.month%12;
}
}
//3.get days
if(leapYear(reDate.year))
{
normalMonthDays[2]=29;
}
if(diffDays + reDate.day <= normalMonthDays[reDate.month])
reDate.day = diffDays + reDate.day;
else
{
reDate.day = diffDays + reDate.day - normalMonthDays[reDate.month];
reDate.month++;
if(reDate.month > 12)
{
reDate.year++;
reDate.month = reDate.month%12;
}
}
return reDate;
}
int main(void)
{
Date initDate;
int diffDays=0;
scanf("%d-%d-%d",&initDate.year, &initDate.month, &initDate.day);
scanf("%d", &diffDays);
Date reDate = getNewDate(initDate, diffDays);
printf("%d-%d-%d\n",reDate.year, reDate.month, reDate.day);
return 0;
}
计算星期
int Zeller(int year,int month,int day)///蔡勒公式算星期
{
if (month==1||month==2)
{
year--;
month+=12;
}
int c=year/100;
int y=year-c*100;
int week=(c/4)-2*c+(y+y/4)+(13*(month+1)/5)+day-1;
while(week<0){week+=7;}
week%=7;
return week;
}