日期的处理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



一、判断闰年

如果年份是400的倍数,或者是4的倍数但不是100的倍数,那么称这个年份为闰年

#include<cstdio>
int main(){
    int n;
    scanf("%d",&n);
    if(n%400==0){
        printf("YES");}
        else{
            if(n%4==0&&n%100!=0) 
            printf("YES");
            else printf("NO");}

          
    
    return 0;
}

二、日期加法

给定一个日期
和一个正整数
,求日期
加上
n 天后的日期。

#include <cstdio>
// 每个月的天数
int dayOfMonth[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// 是否是闰年
bool isLeapYear(int year) {
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
// 给当前日期加1天(注意参数都用了引用&,这样对参数的修改可以同步到函数外)
void addOneDay(int &year, int &month, int &day) {
    day++;                    // 让day加1
    if (day > dayOfMonth[isLeapYear(year)][month]) {  // 如果超过当前月的天数
        month++;              // 让month加1
        day = 1;              // 重置day为1号
    }
    if (month > 12) {         // 如果月份大于12
        year++;               // 让year加1
        month = 1;            // 重置month为1月
    }
}

int main() {
    int year, month, day, n;
    scanf("%d-%d-%d", &year, &month, &day);       // 按格式输入年月日
    scanf("%d", &n);                              // 输入需要增加的天数
    for (int i = 0; i < n; i++) {                 // 遍历n次,每次加1天
        addOneDay(year, month, day);
    }
    printf("%04d-%02d-%02d", year, month, day);   // 按格式输出年月日
    return 0;
}



三、日期减法

#include <cstdio>
// 每个月的天数
int dayOfMonth[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// 是否是闰年
bool isLeapYear(int year) {
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
// 给当前日期加1天(注意参数都用了引用&,这样对参数的修改可以同步到函数外)
void addOneDay(int &year, int &month, int &day) {
    day++;                    // 让day加1
    if (day > dayOfMonth[isLeapYear(year)][month]) {  // 如果超过当前月的天数
        month++;              // 让month加1
        day = 1;              // 重置day为1号
    }
    if (month > 12) {         // 如果月份大于12
        year++;               // 让year加1
        month = 1;            // 重置month为1月
    }
}

int main() {
    int year, month, day, n;
    scanf("%d-%d-%d", &year, &month, &day);       // 按格式输入年月日
    scanf("%d", &n);                              // 输入需要增加的天数
    for (int i = 0; i < n; i++) {                 // 遍历n次,每次加1天
        addOneDay(year, month, day);
    }
    printf("%04d-%02d-%02d", year, month, day);   // 按格式输出年月日
    return 0;
}


以YYYY-MM-DD的格式输出减少了
n天后的日期

#include <cstdio>
// 每个月的天数
int dayOfMonth[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// 是否是闰年
bool isLeapYear(int year) {
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
// 给当前日期加1天(注意参数都用了引用&,这样对参数的修改可以同步到函数外)
void addOneDay(int &year, int &month, int &day) {
    day--;                    // 让day加1
    if (day < 1) {  // 如果超过当前月的天数
        month--;              // 让month加1
                    // 重置day为1号
    }
    if (month < 1) {         // 如果月份大于12
        year--;               // 让year加1
        month = 12;            // 重置month为1月
    }
     if (day < 1) {
        day = dayOfMonth[isLeapYear(year)][month];
    }
}


int main() {
    int year, month, day, n;
    scanf("%d-%d-%d", &year, &month, &day);       // 按格式输入年月日
    scanf("%d", &n);                              // 输入需要增加的天数
    for (int i = 0; i < n; i++) {                 // 遍历n次,每次加1天
        addOneDay(year, month, day);
    }
    printf("%04d-%02d-%02d", year, month, day);   // 按格式输出年月日
    return 0;
}

四、一年中的第几天

给定一个日期,计算它是所在年份中的第几天

#include <cstdio>

int dayOfMonth[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

bool isLeapYear(int year) {
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}//当 isLeapYear(year) 返回 true(即表示是闰年)时,使用的就是 dayOfMonth[1][i],即闰年中第 i 个月的天数;当返回 false(表示是平年)时,使用的就是 dayOfMonth[0][i],即平年中第 i 个月的天数。

int main() {
    int year, month, day;
    scanf("%d-%d-%d", &year, &month, &day);
    int result = day;
    for (int i = 1; i < month; i++) {
        result += dayOfMonth[isLeapYear(year)][i];
    }
    printf("%d", result);
    return 0;
}

五、日期先后

#include <cstdio>
bool binianfen(int year1, int month1, int day1, int year2, int month2, int day2){
    if(year1!=year2){
        return year1<year2;
    }
    if(month1!=month2){
        return month1<month2;
    }
    return day1<day2;
} 
int main(){
    int year1,month1,day1;
    int year2,month2,day2;
    scanf("%d-%d-%d",&year1,&month1,&day1);
    scanf("%d-%d-%d",&year2,&month2,&day2);
    printf(binianfen(year1, month1, day1, year2, month2, day2)?"YES":"NO");
    return 0;

    
}

五,判断周几

#include <cstdio>

int dayOfMonth[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

bool isLeapYear(int year) {
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}

void addOneDay(int &year, int &month, int &day) {
    day++;
    if (day > dayOfMonth[isLeapYear(year)][month]) {
        month++;
        day = 1;
    }
    if (month > 12) {
        year++;
        month = 1;
    }
}

void subOneDay(int &year, int &month, int &day) {
    day--;
    if (day < 1) {
        month--;
    }
    if (month < 1) {
        year--;
        month = 12;
    }
    if (day < 1) {
        day = dayOfMonth[isLeapYear(year)][month];
    }
}

bool isBefore(int year1, int month1, int day1, int year2, int month2, int day2) {
    if (year1 != year2) {
        return year1 < year2;
    }
    if (month1 != month2) {
        return month1 < month2;
    }
    return day1 < day2;
}

bool isAfter(int year1, int month1, int day1, int year2, int month2, int day2) {
    if (year1 != year2) {
        return year1 > year2;
    }
    if (month1 != month2) {
        return month1 > month2;
    }
    return day1 > day2;
}

int main() {
    int year1 = 2021, month1 = 5, day1 = 1, dayOfWeek = 6;
    int year2, month2, day2;
    scanf("%d-%d-%d", &year2, &month2, &day2);
    if (isBefore(year1, month1, day1, year2, month2, day2)) {
        while (isBefore(year1, month1, day1, year2, month2, day2)) {
            addOneDay(year1, month1, day1);
            dayOfWeek = (dayOfWeek + 1) % 7;
        }
    } else if (isAfter(year1, month1, day1, year2, month2, day2)) {
        while (isAfter(year1, month1, day1, year2, month2, day2)) {
            subOneDay(year1, month1, day1);
            dayOfWeek = (dayOfWeek - 1 + 7) % 7;
        }
    }
    printf("%d", dayOfWeek);
    return 0;
}
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值