关于C语言的时间函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言的时间函数相关的知识,希望对你有一定的参考价值。

求一函数 要求:输入 年、月、日 判断与当前差多少天
感谢大侠了

思路:一般做法都是用指定的时间去和一个固定时间来比较,得出此时间与固定时间所差的天数,一般固定时间都使用“1900-01-01”,比如d1与固定时间的差为Num1天,d2与固定时间的差为Nmu2天,那么d1、d2的天数差就是Num1与Num2间的差值了。最好不要直接用d1和d2来比较,因为不好确定他们之间有多少个闰年、大小月等。
以下代码是我从其它程序中摘出来的,大体上能满足你的需求(使用的中文编程,细节自己修改)
#include <stdio.h>
#include <string.h>

typedef unsigned char UNBYTE;
typedef unsigned short UNWORD;
typedef unsigned long UNLONG;
typedef unsigned long DATETIME;

/** 从 0001-01-01 到 1899-12-31 间的天数,故0日期是从1900-01-01开始的 */
const UNLONG n日期开始 = 693594;

/** 时间的转换系数*/
const UNBYTE n每天时数 = 24;
const UNBYTE n每时分数 = 60;
const UNBYTE n每分秒数 = 60;
const UNWORD n每时秒数 = n每分秒数 * n每时分数;
const UNLONG n每天秒数 = n每天时数 * n每时秒数;

typedef enum

TRUE = 0x5A,
FALSE = 0
UBBOOL;

typedef struct

UNBYTE ub_年;
UNBYTE ub_月;
UNBYTE ub_日;
UNBYTE ub_时;
UNBYTE ub_分;
UNBYTE ub_秒;
UNBYTE ub_百分秒;
UNBYTE ub_备用;
S日历时钟; /**8 byte*/

UNBYTE ub_每月天数[2][12] =

31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
;

UNBYTE 润年判断(const UNBYTE lub_年)


if( (lub_年 % 4 == 0) && ((lub_年 % 100 != 0) || (lub_年 % 400 == 0)) )
return 1;
else
return 0;
;

UBBOOL 转换日期(UNBYTE lub_年, UNBYTE lub_月,UNBYTE lub_日, DATETIME &lub_日期)

UNBYTE lub_日表序号 = 0;
UNWORD luw_年;
int i;

/**根据是否为润年取日表的序号*/
luw_年 = 2000 + lub_年;
lub_日表序号 = 润年判断(luw_年);

lub_日期 = lub_日;
if ( (luw_年 >= 2000)
&& (luw_年 <= 2099)
&& (lub_月 >= 1)
&& (lub_月 <= 12)
&& (lub_日 >= 1)
&& (lub_日 <= ub_每月天数[lub_日表序号][lub_月-1]) )

/**计算月*/
for( i=0; i<lub_月-2; i++ )

lub_日期 += ub_每月天数[lub_日表序号][i];


luw_年 -= 1;
lub_日期 += (luw_年 * 365) + (luw_年 / 4) - (luw_年 / 100) + (luw_年 / 400) - n日期开始;
return TRUE;

else

return FALSE;

;

UBBOOL 转换时间(UNBYTE lub_时, UNBYTE lub_分, UNBYTE lub_秒, DATETIME &lub_时间)

if ( (lub_时 < n每天时数) && (lub_分 < n每时分数) && (lub_秒 < n每分秒数) )

lub_时间 = (lub_时 * n每时秒数 + lub_分 * n每分秒数 + lub_秒);
return TRUE;

else

return FALSE;

;

UBBOOL 转换时钟(S日历时钟 &ls_时钟, DATETIME &ldt_时间)

DATETIME dt_日 = 0;
DATETIME dt_秒 = 0;

ldt_时间 = 0;
if ((TRUE == 转换日期(ls_时钟.ub_年, ls_时钟.ub_月, ls_时钟.ub_日, dt_日))
&&(TRUE == 转换时间(ls_时钟.ub_时, ls_时钟.ub_分, ls_时钟.ub_秒, dt_秒)))

ldt_时间 = dt_日 * n每天秒数 + dt_秒;
return TRUE;

else

return FALSE;

;

void main()

DATETIME dt,dt2,cha;
S日历时钟 s_now;
S日历时钟 s_now2;

s_now.ub_年 = 9;
s_now.ub_月 = 12;
s_now.ub_日 = 15;
s_now.ub_时 = 23;
s_now.ub_分 = 59;
s_now.ub_秒 = 59;

s_now2.ub_年 = 9;
s_now2.ub_月 = 12;
s_now2.ub_日 = 16;
s_now2.ub_时 = 0;
s_now2.ub_分 = 0;
s_now2.ub_秒 = 1;

if(( TRUE == 转换时钟(s_now, dt))&&( TRUE == 转换时钟(s_now2, dt2)))

cha = dt2-dt;

else
puts("error");

//////////////////////////////////////////

参考技术A 这个函数是求两个时间之差,单位是秒,换算一下就行。
double difftime(
time_t timer1,
time_t timer0
);

以上是关于关于C语言的时间函数的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言的字符串的几个函数

C语言关于localtime_s()和asctime_s()两个函数的用法。

关于c语言中数组作为函数参数的函数之间调用问题

c语言中关于socket函数的例子

求大神,关于c语言删除函数

C语言关于字符串的操作函数都有哪些?