例题1——今年的第几天
例题2——打印日期
例题3——日期累加
例题4——日期差值
例题5——Day of Week
例题6——日期类
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int arr[4][12]= {
{31,28,31,30,31,30,31,31,30,31,30,31}, // 平年 每月天数
{31,29,31,30,31,30,31,31,30,31,30,31}, // 闰年 每月天数
{31,59,90,120,151,181,212,243,273,304,334,365}, // 平年 每月天数累加
{31,60,91,121,152,182,213,244,274,305,335,366}, // 闰年 每月天数累加
};
int yearDays(int Y) { // 求Y年一共有多少天
int flag;
if(Y%400==0 || (Y%4==0&&Y%100!=0))
flag=1;
else
flag=0;
return arr[flag+2][11];
}
int Sum(int Y,int M,int D) { // 计算该日期是该年的第几天
if(M==1)
return D;
else if(M==2)
return (arr[0][0]+D);
else if(Y%400==0 || (Y%4==0&&Y%100!=0))
return (arr[3][M-2]+D);
else
return(arr[2][M-2]+D);
}
void PrintDate(int sumNum,int Y) { // 给出Y年的第sumNum天,求出具体的日期
int flag;
if(Y%400==0 || (Y%4==0&&Y%100!=0))
flag=1;
else
flag=0;
int pos=0;
while(sumNum>=arr[flag][pos]) {
sumNum-=arr[flag][pos];
pos++;
}
if(sumNum<=0) {
pos--;
sumNum+=arr[flag][pos];
}
printf("%04d-%02d-%02d\n",Y,pos+1,sumNum);
}
void Add(int Y,int M,int D,int A) { // 计算一个日期加上若干天后(加上A天)是什么日期
int sumNum = Sum(Y,M,D)+A, flag;
if(Y%400==0 || (Y%4==0&&Y%100!=0))
flag=1;
else
flag=0;
if(sumNum>arr[flag+2][11]) {
sumNum-=arr[flag+2][11];
Y++;
}
PrintDate(sumNum,Y);
}
// 求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
int dateGap(int y1,int y2,int m1,int m2,int d1,int d2) {
int sum1=Sum(y1,m1,d1), sum2=Sum(y2,m2,d2),ans;
if(y1==y2) {
ans=abs(sum1-sum2)+1;
} else if(y1<y2) {
ans=yearDays(y1)-sum1+1;
for(int i=y1+1; i<y2; i++)
ans+=yearDays(i);
ans+=sum2;
} else {
ans=yearDays(y2)-sum2+1;
for(int i=y2+1; i<y1; i++)
ans+=yearDays(i);
ans+=sum1;
}
return ans;
}
// 日期与2021-07-31相隔太远,结果会出错
// m的范围是1-12
void getXingqi(int y,int m,int d) {
string dayStr[7]= {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int gap = dateGap(y,2021,m,7,d,31);
if(gap<0)
gap+=1;
else
gap-=1;
cout<<dayStr[(gap%7 + 7 + 6)%7]<<endl; // 这边的6是因为2021-07-31是Saturday,对应的dayStr下标为6
}
int main() {
/*int m,Y,M,D,A;
cin>>m;
while(m--) {
cin>>Y>>M>>D>>A;
Add(Y,M,D,A);
}*/
return 0;
}