正如标题所说,我想在不使用任何库函数(如 difftime )的情况下计算两个给定日期之间的差异。 如果答案是算法,那将更好......
答案 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
我希望你明白这一点。
现在让我们看一下算法
如果'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”中。
计算值SUM1 = number_of_days_till_now(dmy2);即dmy2中的天数。在我们的例子中它是 SUM1 = number_of_days_till_now(15-03-2005)= 74;
计算值Y2 = number_of_days_in_the_year(dmy1)。 I.e一年中的总天数1.在我们的示例中是 Y2 = number_of_days_in_the_year(16-02-2001)= 365;
计算值SUM2 = Y2 - number_of_days_till_now(dmy1);即。 365 - 47 = 318;
现在添加SUM + SUM1 + SUM2,您将获得日期dmy2和dmy1之间的差异;
这是一个示例代码:
#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。