
#include <stdioh>
struct date
{
int year;
int month;
int day;
};
int main(void)
{
int isPrime(int year);
int dateDiff(struct date mindate,struct date maxdate);
struct date mindate,maxdate;
int days;
printf("please input the one date:");
scanf("%i-%i-%i",&mindateyear,&mindatemonth,&mindateday);
printf("please input other day:");
scanf("%i-%i-%i",&maxdateyear,&maxdatemonth,&maxdateday);
days=dateDiff(mindate,maxdate);
printf("the day is:%d\n",days);
return 0;
}
//
/ 判断闰年函数(4年一润,100年不润,400年再润) /
//
int isPrime(int year)
{
if ((year%4==0&&year%100!=0)||(year%400==0))
{
return 1;
}
else
{
return 0;
}
}
int dateDiff(struct date mindate,struct date maxdate)
{
int days=0, flag=1;
const int primeMonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};
const int notPrimeMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//
/ 交换两个日期函数,将小的日期给mindate,将大的日期给maxdate /
//
struct date tmp;
if ((mindateyear>maxdateyear)|| (mindateyear==maxdateyear&&mindatemonth>maxdatemonth)||(mindateyear==maxdateyear&&mindatemonth==maxdatemonth&&mindateday>maxdateday))
{
tmp=mindate;
mindate=maxdate;
maxdate=tmp;
}
int maxmonth,minmonth;
//
/ 主要思路:拿2002-8-8 2005-2-22来说 /
/ 将2004-8-8---2005-2-22----2005-7-8 /
/一前一后刚好N年,算出2005-2-22到2005-7-8的天数,然后用总年36(5|6)减掉) /
/ 2002-9-8 2005-11-22 /
/ 2002-9-8-----2005-9-8-----2005-11-22(这次是加上后面天数) /
/如何判断是加还是减呢年大而月小的,则是减,程序中用flag标示 /
//
if (maxdatemonth<mindatemonth)
{
maxmonth=mindatemonth;
minmonth=maxdatemonth;
flag=-1;
}
else
{
maxmonth=maxdatemonth;
minmonth=mindatemonth;
flag=1;
}
//
/ 从mindateyear开始累加到maxdateyear /
//
for(int j=mindateyear;j<maxdateyear;++j)
{
if (isPrime(j)==1)
{
days+=366;
}
else
days+=365;
}
//
/ 从minmonth累加到maxmonth,分闰年和平年 /
//
int day;
if(isPrime(maxdateyear)==1)
{
for(int i=minmonth;i<maxmonth;i++)
{
day=primeMonth[i-1]flag;
days=days+day;
}
days=days+maxdateday-mindateday;
}
else
{
for (int i=minmonth;i<maxmonth;i++)
{
day=notPrimeMonth[i-1]flag;
days=days+day;
}
days=days+maxdateday-mindateday;
}
return days;
}
main()
{
struct date date1,date2;
int days,days1=0,days2=0;
int daytab[]={31,28,31,30,31,30,31,31,30,31,30,31};
int i;
//大概如此可能部分下标存在错误,自己调试修改吧
scanf("%d%d%d",&date1year,&date1month,&date1day);
scanf("%d%d%d",&date2year,&date2month,&date2day);
//计算从当年元月1日到的天数
for(i=0;i<date1month;i++)
{
days1 += daytab[i];
}
if((date1year%4==0&&date1year%100!=0)||(date1year%400==0) && date1month>2)
{
days1++;
}
days1 += date1day;
//
for(i=date1year;i<date2year;i++)
{
days2 += 365;
if((date2year%4==0&&date2year%100!=0)||(date2year%400==0))
{
days2++;
}
}
for(i=0;i<date2month;i++)
{
days2 += daytab[i];
}
if((date2year%4==0&&date2year%100!=0)||(date2year%400==0) && date2month>2)
{
days2 ++;
}
days2 += date1day;
days=day2-day1;
printf("%d\n",days);
}
/
程序描述:设计一个表示日期的结构体。编写一个函数,计算两个日期之间差多少天。在 main 函数 中调用该函数,并显示。
/
#include <stdioh>
#include <stdlibh>
#include <mathh>
#define LEAP_YEAR 366
#define COMMON_YEAR 365
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
struct date
{
int year;
int month;
int day;
}date1,date2;
typedef struct date DATE;
void interval_days()
{
int i,result,sum1,sum2;
printf("请输入第一个日期: ");
scanf("%d-%d-%d",&date1year,&date1month,&date1day);
if(date1year<=0 || date1month<=0 || date1month>12 || date1day<=0 || date1day>31)
{
printf("输入错误,请准确输入日期!\n");
exit(-1);
}
printf("请输入第二个日期: ");
scanf("%d-%d-%d",&date2year,&date2month,&date2day);
if(date2year<0 || date2month<0 || date2month>12 || date2day<0 || date2day>31)
{
printf("输入错误,请准确输入日期!\n");
exit(-1);
}
//算法思路:我们以公元1年1月1日为基准,分别计算间隔天数,然后两者相减就是这两个日期的间隔天数了
sum1=sum_days(&date1);
sum2=sum_days(&date2);
result=abs(sum1-sum2);
printf("日期之差为: %d\n",result);
}
int sum_days(DATE date)
{
int i,sum;
//计算公元1年1月1日到某年的1月1号的天数
for(i=1,sum=0;i<date->year;i++){
if(i%400==0 || (i%4==0 && i%100!=0))
sum+=LEAP_YEAR;
else
sum+=COMMON_YEAR;
}
//计算该年的1月1号到该日期的天数
for(i=0;i<date->month-1;i++){
sum+=days[i];
}
if(date->month>2 && (date->year%400==0 || (date->year%4==0 && date->year%100!=0)))
sum+=date->day+1;
else
sum+=date->day;
return sum;
}
int main()
{
interval_days();
return 0;
}
这是我的程序思路,仅供参考,你可以用手机上的日历的日期换算功能验证下哈。示例运行结果如下:
Local date2,date1
date2 = ctod('2014-12-19')
date1 = ctod('2014-10-20')
if (date2-date1)<30 then
messagebox('相差'+transform(date2-date1)+'天')
else
if MOD(date2-date1,30) = 0 then
messagebox('相差'+transform(Floor((date2-date1)/30))+'个月')
else
messagebox('相差'+transform(Floor((date2-date1)/30))+'个月'+transform(MOD(date2-date1,30))+'天')
endif
endif
通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期+时间(2008-09-04 12:11:10)等。
//获取日期+时间
DateTimeNowToString(); // 2008-9-4 20:02:10
DateTimeNowToLocalTime()ToString(); // 2008-9-4 20:12:12
//获取日期
DateTimeNowToLongDateString()ToString(); // 2008年9月4日
DateTimeNowToShortDateString()ToString(); // 2008-9-4
DateTimeNowToString("yyyy-MM-dd"); // 2008-09-04
DateTimeNowDateToString(); // 2008-9-4 0:00:00
//获取时间
DateTimeNowToLongTimeString()ToString(); // 20:16:16
DateTimeNowToShortTimeString()ToString(); // 20:16
DateTimeNowToString("hh:mm:ss"); // 08:05:57
DateTimeNowTimeOfDayToString(); // 20:33:507187500
//其他
DateTimeToFileTime()ToString(); // 128650040212500000
DateTimeNowToFileTimeUtc()ToString(); // 128650040772968750
DateTimeNowToOADate()ToString(); // 396958461709606
DateTimeNowToUniversalTime()ToString(); // 2008-9-4 12:19:14
DateTimeNowYearToString(); 获取年份 // 2008
DateTimeNowMonthToString(); 获取月份 // 9
DateTimeNowDayOfWeekToString(); 获取星期 // Thursday
DateTimeNowDayOfYearToString(); 获取第几天 // 248
DateTimeNowHourToString(); 获取小时 // 20
DateTimeNowMinuteToString(); 获取分钟 // 31
DateTimeNowSecondToString(); 获取秒数 // 45
//n为一个数,可以数整数,也可以事小数
dtAddYears(n)ToString(); //时间加n年
dtAddDays(n)ToString(); //加n天
dtAddHours(n)ToString(); //加n小时
dtAddMonths(n)ToString(); //加n个月
dtAddSeconds(n)ToString(); //加n秒
dtAddMinutes(n)ToString(); //加n分
SQL语句使用时间和日期的函数
getdate():获取系统当前时间
dateadd(datepart,number,date):计算在一个时间的基础上增加一个时间后的新时间值,比如:dateadd(yy,30,getdate())
datediff(datepart,startdate,enddate):计算两个时间的差值,比如:datediff(yy,getdate(),'2008-08-08')
dataname(datepart,date):获取时间不同部分的值,返回值为字符串
datepart(datepart,date):和datename相似,只是返回值为整型
day(date):获取指定时间的天数
month(date):获取指定时间的月份
year(date):获取指定时间的年份
select year(getdate()) :当前年份
DateDiff 函数
返回两个日期之间的时间间隔。
DateDiff(interval, date1, date2 [,firstdayofweek[, firstweekofyear]])
DateDiff 函数的语法有以下参数:
参数
interval
必选项。String expression 表示用于计算 date1 和 date2 之间的时间间隔。有关数值,请参阅“设置”部分。
date1, date2
必选项。日期表达式。用于计算的两个日期。
Firstdayofweek
可选项。指定星期中第一天的常数。如果没有指定,则默认为星期日。有关数值,请参阅“设置”部分。
Firstweekofyear
可选项。指定一年中第一周的常数。如果没有指定,则默认为 1 月 1 日所在的星期。有关数值,请参阅“设置”部分。
设置
interval 参数可以有以下值:
设置 描述
yyyy 年
q 季度
m 月
y 一年的日数
d 日
w 一周的日数
ww 周
h 小时
n 分钟
s 秒
firstdayofweek 参数可以有以下值:
常数 值 描述
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbSunday 1 星期日(默认)
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六
firstweekofyear 参数可以有以下值:
常数 值 描述
vbUseSystem 0 使用区域语言支持 (NLS) API 设置。
vbFirstJan1 1 由 1 月 1 日所在的星期开始(默认)。
vbFirstFourDays 2 由在新年中至少有四天的第一周开始。
vbFirstFullWeek 3 由在新的一年中第一个完整的周开始。
说明
DateDiff 函数用于判断在两个日期之间存在的指定时间间隔的数目。例如可以使用 DateDiff 计算两个日期相差的天数,或者当天到当年最后一天之间的星期数。
要计算 date1 和 date2 相差的天数,可以使用“一年的日数”(“y”)或“日”(“d”)。当 interval 为“一周的日数”(“w”)时,DateDiff 返回两个日期之间的星期数。如果 date1 是星期一,则 DateDiff 计算到 date2 之前星期一的数目。此结果包含 date2 而不包含 date1。如果 interval 是“周”(“ww”),则 DateDiff 函数返回日历表中两个日期之间的星期数。函数计算 date1 和 date2 之间星期日的数目。如果 date2 是星期日,DateDiff 将计算 date2,但即使 date1 是星期日,也不会计算 date1。
如果 date1 晚于 date2,则 DateDiff 函数返回负数。
firstdayofweek 参数会对使用“w”和“ww”间隔符号的计算产生影响。
如果 date1 或 date2 是日期文字,则指定的年度会成为日期的固定部分。但是如果 date1 或 date2 被包括在引号 (" ") 中并且省略年份,则在代码中每次计算 date1 或 date2 表达式时,将插入当前年份。这样就可以编写适用于不同年份的程序代码。
在 interval 为“年”(“yyyy”)时,比较 12 月 31 日和来年的 1 月 1 日,虽然实际上只相差一天,DateDiff 返回 1 表示相差一个年份。
下面的示例利用 DateDiff 函数显示今天与给定日期之间间隔天数:
Function DiffADate(theDate)
DiffADate = "从当天开始的天数:" & DateDiff("d", Now, theDate)
End Function
要求
版本2
请参阅
DateAdd 函数 | DatePart 函数
相关资料:>
以上就是关于c语言 用库函数计算两日期相差的天数全部的内容,包括:c语言 用库函数计算两日期相差的天数、帮忙解决一下C语言求日期差的问题!谢谢!、设计一个表示日期的结构体。编写一个函数,计算两个日期之间差多少天。在 main 函数 中调用该函数,并显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)