自用笔记58——蔡勒(Zeller)公式

请你编写一个程序来计算两个日期之间隔了多少天。

日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。

示例 1:

输入:date1 = “2019-06-29”, date2 = “2019-06-30”
输出:1
示例 2:

输入:date1 = “2020-01-15”, date2 = “2019-12-31”
输出:15

提示:

给定的日期是 1971 年到 2100 年之间的有效日期。
通过次数8,150提交次数16,184

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-days-between-two-dates
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

int daysBetweenDates(char * date1, char * date2){
    int year1=0,month1=0,day1=0,year2=0,month2=0,day2=0,i=0,zday1=0,zaday1=0,zaday2=0,zday2=0,zyear=0,result=0;
    int dayinm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    year1 = (date1[3]- '0')+(date1[2]- '0')*10+(date1[1]- '0')*100+(date1[0]- '0')*1000;
    month1 = (date1[6]- '0')+(date1[5]- '0')*10;
    day1 = (date1[9]- '0')+(date1[8]- '0')*10;
    year2 = (date2[3]- '0')+(date2[2]- '0')*10+(date2[1]- '0')*100+(date2[0]- '0')*1000;
    month2 = (date2[6]- '0')+(date2[5]- '0')*10;
    day2 = (date2[9]- '0')+(date2[8]- '0')*10;
    for(i=1;i<month1;i++)
        zday1 = zday1+dayinm[i];
    if((year1 % 100 == 0 && year1 % 400 ==0) || (year1 % 100 != 0 && year1 % 4 == 0))
    {
        if(month1 > 2)
            zday1 = zday1+day1;
        else
            zday1 = zday1+day1-1;
        zaday1 = 366-zday1;
    }
    else
    {
        zday1 = zday1+day1-1;
        zaday1 = 365-zday1;
    }
    for(i=1;i<month2;i++)
        zday2 = zday2+dayinm[i];
    if((year2 % 100 == 0 && year2 % 400 ==0) || (year2 % 100 != 0 && year2 % 4 == 0))
    {
        if(month2 > 2)
            zday2 = zday2+day2;
        else
            zday2 = zday2+day2-1;
        zaday2 = 366-zday2;
    }
    else
    {
        zday2 = zday2+day2-1;
        zaday2 = 365-zday2;
    }
    if(year1 > year2)
    {
        for(i=year2+1;i<year1;i++)
        {
            if((i % 100 == 0 && i % 400 ==0) || (i % 100 != 0 && i % 4 == 0))
                zyear = zyear+1;
        }
        result = (year1-year2-1)*365+zday1+zaday2+zyear;
    }
    else if(year1 == year2)
    {
        result = abs(zday1-zday2);
    }
    else if(year1 < year2)
    {
        for(i=year1+1;i<year2;i++)
        {
            if((i % 100 == 0 && i % 400 ==0) || (i % 100 != 0 && i % 4 == 0))
                zyear = zyear+1;
        }
        result = (year2-year1-1)*365+zday2+zaday1+zyear;
    }
    return result;
}

在这里插入图片描述

好像之前做过一次这样的题,是给定任意日期计算其是星期几。当时用的思路是用1971年1月1日星期五为基准,计算给定日期与基准的天数间隔,然后推算星期几。
这道题也可以用这个思路,可以先编写一个计算任意给定日期与基准之间的天数间隔,然后计算两个日期的间隔差。

但是这次我决定换个思路,直接计算两个日期之间的天数间隔,就要面临下面几个问题:
1,首先需要将字符数组中的年月日信息提取出来,字符型转换到整型通过-'0'来实现,或者通过atoi()函数实现
2,其次由于不确定所给两个日期年份谁大谁小,所以分情况讨论。
1)当年份A比年份B大时,计算A年与当年1月1日的间隔天数,同理计算出B年的间隔天数后计算出当年剩余天数,将两个间隔天数相加后加上AB两年间隔的年数乘以365或366;
2)当年份A与年份B一样大时,直接计算即可。
3,计算间隔天数时有个关键问题——判断日期间隔中是否存在闰年多出的一天2月29日,所以在步骤2中计算间隔天数时再加一个判断用来分情况计算平年和闰年的间隔天数。同时用一个判断来统计A,B两个年份间的闰年数,把多出的天数加进去。

上一次计算星期的题目有一个基姆拉尔森公式,这次计算日期间隔有一个蔡勒(Zeller)公式:
在这里插入图片描述
在这里插入图片描述
有关其推导可看大佬的推导过程:https://www.cnblogs.com/faterazer/p/11393521.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值