#include <stdio.h>
#include <time.h>
time_t YMD_hhmmss_2_s70(int Y, int M, int D, int hh, int mm, int ss){
struct tm *target_tm
time_t tt
time (&tt)
target_tm=localtime(&tt)
target_tm->tm_year = Y - 1900
target_tm->tm_mon= M - 1
target_tm->tm_mday = D
target_tm->tm_hour = hh // hour
target_tm->tm_min = mm
target_tm->tm_sec = ss
tt = mktime(target_tm) // from tm to time_t (s)
return tt
}
int main()
{
int y1,m1,d1,y2,m2,d2
time_t t1,t2
int dt
printf("input y1 m1 d1: ")
scanf("%d %d %d",&y1,&m1,&d1)
printf("\ninput y2 m2 d2: ")
scanf("%d %d %d",&y2,&m2,&d2)
t1 = YMD_hhmmss_2_s70(y1,m1,d1,0,0,0)
t2 = YMD_hhmmss_2_s70(y2,m2,d2,0,0,0)
dt = (t2-t1)/(24*3600)
printf("\ndt=%d\n",dt)
return 0
}
这里未包含日期的合法性判断。
1970 年以前 要另写程序。某年的日子是当年的第几天可用下面函数得出:
int YMD_2_JD(int Y, int M, int D){
const short MonthDay[]={0,31,28,31,30,31,30,31,31,30,31,30,31}
int JD,i
JD=D
for (i=0i<Mi++) JD+=MonthDay[i]
if (((Y%4==0)&&(Y%100!=0)||(Y%400==0)) &&(M>2)) JD++
return JD
}
某年是否闰年,用 (Y%4==0)&&(Y%100!=0)||(Y%400==0) 判断。闰年366天,平年365天。 有了这些,写程序不难。
未考虑公元前的年月日计算。
代码存在一些问题:
#include<stdio.h#define MAXNUM1 14
#define MAXNUM2 14
int main()
{
int a,b,c,Y,M,D,Days
int Days_[MAXNUM1]={0,31,28,31,30,31,30,31,31,30,31,30,31}
int Date[MAXNUM2]={0,1,2,3,4,5,6,7,8,9,10,11,12}
printf("Plese choose what you want to do.\n1.Date change Days\n2.Days change Date\n")
scanf("%d",&a)
if(a==1)
{ Days = 0
printf("Plese enter a date(Y\M\D).\n")
scanf("%d %d %d",&Y,&M,&D)
if(Y%4==0&&Y%100!=0||Y%400==0)//这里改下
{
for(b=1b < Mb++)
if(b==2)//闰年二月加一天
{
Days+=Days_[b]+1 }
else
{
Days+=Days_[b]
}
}else
{
for(b=1b < Mb++)
{
Days+=Days_[b]
}
}
Days += D
printf("The date which you enter is the %d days.\n",Days)
}else //a==2
{
printf("Plese enter a days.")
scanf("%d",&Days)
for(b=1b < 13b++)//未考虑年份的问题
{
if(Days <= Days_[b]) break
Days -= Days_[b]
}
printf("The day which you enter is the %d\%d days.\n",b,Days)
}
}
上面是简单的实现,希望有帮助
计算两个年月日之间的天数,思路是分别算出日期的总天数然后相减。要考虑闰年的情况,判断闰年的口诀:4年一闰,100年不闰,400年再闰。
((year % 4 == 0 &&year % 100 != 0) || year % 400 == 0)
网上找了一个(偷懒= =!),修改下如下:
#include <stdio.h>
int sum(int y,int m,int d)
{
unsigned char x[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}
int i,s=0
for(i=1i<yi++)
if(i%4==0 &&i%100!=0 || i%400==0)
s+=366//闰年
else
s+=365//平年
if(y%4==0 &&y%100!=0 || y%400==0)
x[2]=29
for(i=1i<mi++)
s+=x[i]//整月的天数
s+=d//日的天数
return s//返回总天数,相对公元1年
}
void main()
{
unsigned char y1,m1,d1,y2,m2,d2
int s1,s2
printf("输入第一个年 月 日:")
scanf("%d %d %d",&y1,&m1,&d1)
printf("输入第二个年 月 日:")
scanf("%d %d %d",&y2,&m2,&d2)
s1=sum(y1,m1,d1)
s2=sum(y2,m2,d2)
if (s1 >s2)
printf("相差天数:%ld\n",s1-s2)
else
printf("相差天数:%ld\n",s2-s1)
}
以上代码VC6编译测试通过。
虽然这个思路显得有些笨,但是其它算法,代码太长太复杂,要考虑多种情况,不如直接算两个日期距离公元元年1月1日的天数,然后相减