如何计算两个日期之间的差异而不使用任何现成的库函数?

时间:2011-07-19 05:47:33

标签: c algorithm

正如标题所说,我想在不使用任何库函数(如 difftime )的情况下计算两个给定日期之间的差异。 如果答案是算法,那将更好......

4 个答案:

答案 0 :(得分:1)

我想告诉你应该以什么方式继续

首先写几个函数......

一个。 int valiDate(char *date_string);

此函数应将日期作为以字符串形式输入的输入。它应该检查它是否是正确的日期。    我希望你能做到这一点...回复回来告诉我你要检查的东西有什么细节,如果它是一个有效的日期。它应该    如果是正确的日期,则返回1,否则返回0。

B中。 int year(char *date_string);

此函数应返回给定日期的年份。记住你应该验证返回年份的date_string befotre。    如果日期不合适,则应返回负值。

℃。 int month(char *date_string);

此函数应返回给定日期的MOnth。记住你应该验证返回月份的date_string befotre。        如果日期不合适,则应返回负值。

d。 int date(char *date_string);

此函数应返回给定日期的日期值。记住你应该验证返回日期的date_string befotre。        如果日期不合适,则应返回负值。

电子。 int number_of_days_in_the_year(int year);

此函数应采用输入形式的整数年,然后返回该年的天数。        对于Eg -                   如果输入是2004,则输出应为366
                  如果输入是2005,则输出应为365

F。 int number_of_days_till_now(char *date_string);

此函数应返回给定年份中给定日期之前的天数。例如                请注意,在所有示例中,我都考虑DD_MM_YY格式的日期输入字符串。

                       Input                                            Output
                       23-02-2004  (Feb 23 2004)               54
                       01-03-2004  (Mar 1 2004)                 61

                       15-04-2003  (Apr 15 2003)               105
                       01-03-2003  (Mar 1 2003)                  60

我希望你明白这一点。

现在让我们看一下算法

  1. 让我们说日期asr存储在字符串'dmy2'和dmy1'。
  2. ValiDate使用功能1的日期。
  3. 计算年份dmy2和dmy1之间的差异;让我们说它是'year_diff'
  4. 如果'year_diff'> 1然后        一个。计算dmy1和dmy2之间年份的天数。例如,如果dmy2 = 15-03-2005,那么dmy1 = 16-02-2001            年'year_diff'=(2005-2001)= 4之间的差异。            因此,使用函数'number_of_days_in_the_year'计算2002年,2003,2004年的总天数(函数5)            添加它们,让我们说它存储在“SUM”中。

  5. 计算值SUM1 = number_of_days_till_now(dmy2);即dmy2中的天数。在我们的例子中它是                            SUM1 = number_of_days_till_now(15-03-2005)= 74;

  6. 计算值Y2 = number_of_days_in_the_year(dmy1)。 I.e一年中的总天数1.在我们的示例中是                            Y2 = number_of_days_in_the_year(16-02-2001)= 365;

  7. 计算值SUM2 = Y2 - number_of_days_till_now(dmy1);即。 365 - 47 = 318;

  8. 现在添加SUM + SUM1 + SUM2,您将获得日期dmy2和dmy1之间的差异;

  9. 这是一个示例代码:

    #include<stdio.h>
    #include<math.h>
    void main()
    {
    int day1,mon1,year1,day2,mon2,year2;
    int ref,dd1,dd2,i;
    clrscr();
    printf("Enter first day, month, year");
    scanf("%d%d%d",&day1,&mon1,&year1);
    scanf("%d%d%d",&day2,&mon2,&year2);
    ref = year1;
    if(year2<year1)
    ref = year2;
    dd1=0;
    dd1=func1(mon1);
    for(i=ref;i<year1;i++)
    {
        if(i%4==0)
        dd1+=1;
    }
    dd1=dd1+day1+(year1-ref)*365;
    printf("No. of days of first date fronm the Jan 1 %d= %d",year1,dd1);
    /* Count for additional days due to leap years*/
    dd2=0;
    for(i=ref;i<year2;i++)
    {
        if(i%4==0)
        dd2+=1;
    }
    dd2=func1(mon2)+dd2+day2+((year2-ref)*365);
    printf("No. of days from the reference year's first Jan = %d",dd2);
    printf("Therefore, diff between the two dates is %d",abs(dd2-dd1));
    
    getch();
    }
    

    快乐的编码。

答案 1 :(得分:1)

int getDifferentDay(int d1,int m1,int y1,int d2,int m2,int y2) {     int x1,x2;

m1 = (m1 + 9) % 12;
y1 = y1 - m1 / 10;
x1= 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + ( d1 - 1 );

m2 = (m2 + 9) % 12;
y2 = y2 - m2 / 10;
x2= 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + ( d2 - 1 );

return (x2 - x1);

}

答案 2 :(得分:0)

以下是我刚编写的一些代码,用于计算年,月和日的差异。它属于公共领域。

public sealed class DateDifference {
        int years;

        public int Years {
            get { return years; }
        }
        int months;

        public int Months {
            get { return months; }
        }
        int days;

        public int Days {
            get { return days; }
        }

        public override string ToString()
        {
            return string.Format("[DateDifference Years={0}, Months={1}, Days={2}]", years, months, days);
        }


        public DateDifference(DateTime earlier, DateTime later){
            if(later<earlier)
                throw new ArgumentException("later is earlier than 'earlier'.");
            bool isleapday=(earlier.Month==2 && earlier.Day==29);
            DateTime tmp=isleapday ? new DateTime(earlier.Year,2,28) : earlier;
            while(true){
                try {
                    tmp=tmp.AddYears(1);
                    if(isleapday && DateTime.IsLeapYear(tmp.Year))
                        tmp=new DateTime(tmp.Year,2,29);
                } catch(ArgumentOutOfRangeException){
                    break;
                }
                if(tmp<=later){
                    years++;
                    earlier=tmp;
                } else {
                    break;
                }
            }
            // Add months
            tmp=earlier;
            while(true){
                try {
                    tmp=tmp.AddMonths(1);
                if(isleapday && tmp.Day!=29 && tmp.Month!=2)
                    tmp=new DateTime(tmp.Year,tmp.Month,29);
                } catch(ArgumentOutOfRangeException){
                    break;
                }
                if(tmp<=later){
                    months++;
                    earlier=tmp;
                } else {
                    break;
                }
            }
            tmp=earlier;
            while(true){
                try {
                    tmp=tmp.AddDays(1);
                } catch(ArgumentOutOfRangeException){
                    break;
                }
                if(tmp<=later){
                    days++;
                    earlier=tmp;
                } else {
                    break;
                }
            }
        }
    }

答案 3 :(得分:0)

它可能会帮助您了解Doomsday algorithm