C语言实现时间差

转自:http://blog.sina.com.cn/s/blog_7c59079701011a9j.html

http://www.jb51.net/article/102670.htm

fast_sky@sina.com


1、常用的时间存储方式

1)time_t类型,这本质上是一个长整数,表示从1970-01-01 00:00:00到目前计时时间的秒数,如果需要更精确一点的,可以使用timeval精确到毫秒。

2)tm结构,这本质上是一个结构体,里面包含了各时间字段

struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
}; 

其中tm_year表示从1900年到目前计时时间间隔多少年,如果是手动设置值的话,tm_isdst通常取值-1。

3)struct timeval结构体在time.h中的定义为

struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};


2、常用的时间函数  
time_t time(time_t *t); //取得从1970年1月1日至今的秒数
char *asctime(const struct tm *tm); //将结构中的信息转换为真实世界的时间,以字符串的形式显示
char *ctime(const time_t *timep); //将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样
struct tm *gmtime(const time_t *timep); //将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针
struct tm *localtime(const time_t *timep); //和gmtime类似,但是它是经过时区转换的时间。
time_t mktime(struct tm *tm); //将struct tm 结构的时间转换为从1970年至今的秒数
int gettimeofday(struct timeval *tv, struct timezone *tz); //返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用
double difftime(time_t time1, time_t time2); //返回两个时间相差的秒数 

1、两个日期之间的时间差
2、某个日期之后,绝对值差值之后的某个日期
3、某年日期,算出星期几
下面见源码:
#ifndef CALCULATE_H
#define CALCULATE_H
 
typedef struct
{
         int year;
         int month;
         int day;
}date;
 
int Leap_Year(int year);
int Calculate(date a,date b);
date Date_String_To_Format(char *string_date);
int Distance_Date(char *string_begin, char *string_end);
int Week(char *string_date);
int Judge(date d1);
date Now_to_Later(date now, int gap);
date Now_To_Fronter(date now, int gap);
 
#endif
 
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include "calculate.h"
 
 
 
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  
功能: 将年转化为天
参数:
返回:
sum---转化的天数
修改:
备注:
 
 int Year_To_Day(int year_begin, int year_end)
{
         int sum = 0;
         int number = year_begin;
 
         while(number != year_end)
         {
                   sum = sum + 365 + Leap_Year(year_begin);
                   number++;
         }
 
         return sum;
}
功能:将月转化为天数
参数:
返回:
-----转化完成的天数
修改:
备注:
 
 int Month_To_Day(date now)
{
         int i, day = 0;
 
         for (i = 0; i < now.month - 1; ++i)
         {
                   day = day + month[i];
         }
 
         return (now.month >= 3) ? day + now.day + Leap_Year(now.year) :  day + now.day;
 
}
功能:计算两个日期之间的差值
参数:
begin---起始日期
end----结束日期
返回:
---算出的时间差值
修改:
备注:且begin <= end
 int Calculate(date begin,date end)
{
         return Year_To_Day(begin.year, end.year) - Month_To_Day(begin) + Month_To_Day(end);
}
 
功能:是否为闰年
参数:
返回:
1----成功
0--失败
修改:
备注:

 int Leap_Year(int year)
{
         return  ((year % 400 == 0) || ((year % 4 == 0)&& (year 0 != 0))) ? 1 : 0;
}
  
 
功能:字符日期转化为结构体格式
参数:
string_date----传入日前格式(20110101)只取前八位,后面不处理
返回:
---转化完成的格式
修改:
备注:

 
 date Date_String_To_Format(char *string_date)
{
         char year[5], month[3], day[3];
         date d1;
 
         memset(year, 0x0, sizeof(year));
         memset(month, 0x0, sizeof(month));
         memset(day, 0x0, sizeof(day));
 
         memcpy(year, string_date, 4);
         memcpy(month, string_date+4, 2);
         memcpy(day, string_date+6, 2);
 
         d1.year = atoi(year);
         d1.month = atoi(month);
         d1.day = atoi(day);
 
         return d1;
}
 
功能:计算两者之间的差值
参数:
返回:
sum---计算所得两个日期之间的差值
修改:
备注:

 
int Distance_Date(char *string_begin, char *string_end)
{
         date d1,d2;
         int    sum;
 
         d1=Date_String_To_Format(string_begin);
         d2=Date_String_To_Format(string_end);
         if(Judge(d1)&&Judge(d2))
         {
                   if(d1.year<=d2.year)
                   {
                            sum=Calculate(d1,d2);
                   }
                   else
                   {
                            sum=Calculate(d2,d1);
                   }
         }
 
         return sum;
}
 
功能:某年的星期几
参数:
返回:
1--7----传出的星期数
修改:
备注:

 
 int Week(char *string_date)
{
         date d1;
         int  century = 0;
         int year = 0;
         int weekday = 0;
         int month = 0;
         char ch;
 
         d1=Date_String_To_Format(string_date);
         if (Judge(d1))
         {
                   if (d1.month < 3)
                   {
                            month = d1.month + 12;
                            d1.year--;
                   }
                   else
                            month = d1.month;
                   century = d1.year/100;
                   year = d1.year % 100;
 
                   weekday = year + (year/4)+(century/4)-(2*century)+(26*(month + 1)/10) + d1.day - 1;
                   weekday = (weekday < 0) ? weekday + 7: weekday;
         }       
 
         return (weekday % 7 == 0) ? 7 : weekday % 7;
}
 
功能:从现在日期往后计算多少天之后的日期
参数:
返回:
---多少天之后的日期
修改:
备注:

 
 date Now_to_Later(date now, int gap)
{
         date d1;
         int sum, sum_bak;
         int temp;
 
         d1 = now;
         sum = gap;
        
         if(Judge(d1)&&(sum>0) && (sum < 3649270))
         {
                   while(sum>365)
                   {
                            if(d1.month>=3)
                            {
                                     d1.year++;
                                     sum=sum-365-Leap_Year(d1.year);
                            }
                            else
                            {
                                     sum=sum-365-Leap_Year(d1.year);
                                     d1.year++;
                            }
                   }
                   while(sum > 0)
                   {
                            if (d1.month != 2)
                            {
                                     temp = month[d1.month - 1] -d1.day + 1;
                            }
                            else
                            {
                                     temp = month[d1.month - 1] +Leap_Year(d1.year)- d1.day + 1;
                            }
                            sum_bak = sum;
                            sum = sum - temp;
                            if (sum  >= 0)
                            {
                                     d1.month++;
                                     d1.day = 1;
                                     if (d1.month > 12)
                                     {
                                               d1.month = 1;
                                               d1.year++;
                                     }
                                     sum_bak = sum;
                            }
                   }
                   d1.day += sum_bak;
         }
 
         return d1;
}
 
功能:从当前日期往前计算多少天前的日期
参数:
返回:
------计算完成的日期
修改:
备注:

 
 date Now_To_Fronter(date now, int gap)
{
         date d1;
         int sum, sum_bak;
         int temp;
 
         d1 = now;
         sum = gap;
        
         if(Judge(d1)&&(sum < 0) && (sum > -3649270))
         {
                   while(sum < -365)
                   {
                            if(d1.month>=3)
                            {
                                     sum=sum+365+Leap_Year(d1.year);
                                     d1.year--;
                            }
                            else
                            {
                                     d1.year--;
                                     sum=sum + 365 + Leap_Year(d1.year);
                            }
                   }
 
                   sum_bak = sum;
 
                   while(sum < 0)
                   {
                            temp =-d1.day;
                            sum = sum - temp;
                            if (sum  <= 0)
                            {
                                     d1.month--;
                                     if (d1.month < 1)
                                     {
                                               d1.month = 12;
                                               d1.year--;
                                     }
                                     if (d1.month == 2)
                                               d1.day  = month[d1.month - 1] + Leap_Year(d1.year);
                                     else
                                               d1.day = month[d1.month - 1];
 
                                     sum_bak = -sum;
                            }
                   }
                   if (sum_bak < 0)
                   {
                            d1.day = d1.day + sum_bak;
                   }else
                   {
 
                            if (d1.month == 2)
                                     d1.day = month[d1.month - 1] + Leap_Year(d1.year) - sum_bak;
                            else
                                     d1.day = month[d1.month - 1] - sum_bak;
                   }
         }
 
         return d1;
}
 
功能:判断输入日期是否合法
参数:
返回:
1----成功
0--失败
修改:
备注:

 
 int udge(date d1)
{
         return     ((d1.year > 0 && d1.year <= 9999) &&
                            (d1.month > 0 && d1.month <= 12) &&
         (d1.day > 0 &&  (
         ((d1.month == 2) && (d1.day < month[d1.month - 1] + Leap_Year(d1.year)))||
         ((d1.month != 2) && (d1.day < month[d1.month - 1]))
                                               ))) ? 1 : 0;

}

 unsigned short BCDToInt(unsigned char bcd) //BCD转十进制
{
    return (0xff & (bcd>>4))*10 +(0xf & bcd);
}


int IntToBCD(unsigned char Dec) //十进制转BCD
{
    return ((Dec/10)<<4)+((Dec%10)&0x0f);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值