基础——日期问题

这段代码实现了一系列关于日期的计算功能,包括判断是否为闰年、计算某年总天数、求指定日期是当年的第几天、输出具体日期、日期累加、日期差值计算、星期数获取以及日期类的简单操作。提供了如Add函数用于日期加减,dateGap函数计算两个日期之间的天数,getXingqi函数获取指定日期是星期几。
摘要由CSDN通过智能技术生成

例题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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值