原文地址:http://blog.sina.com.cn/s/blog_7c59079701011a9j.html
最近因為一個項目需要,默認一個時間值,即當天的前一天日期,順手就將其他的幾個功能一並實現了,主要為
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----結束日期
返回:
---算出的時間差值
修改:
備注:
fast_sky@sina.com
且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--失敗
修改:
備注:
fast_sky@sina.com
int Leap_Year(int year)
{
return ((year % 400 == 0) || ((year % 4 == 0)&& (year 0 != 0))) ? 1 : 0;
}
功能:字符日期轉化為結構體格式
參數:
string_date----傳入日前格式(20110101)只取前八位,后面不處理
返回:
---轉化完成的格式
修改:
備注:
fast_sky@sina.com
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---計算所得兩個日期之間的差值
修改:
備注:
fast_sky@sina.com
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----傳出的星期數
修改:
備注:
fast_sky@sina.com
蔡勒公式
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;
}
功能:從現在日期往后計算多少天之后的日期
參數:
返回:
---多少天之后的日期
修改:
備注:
fast_sky@sina.com
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;
}
功能:從當前日期往前計算多少天前的日期
參數:
返回:
------計算完成的日期
修改:
備注:
fast_sky@sina.com
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--失敗
修改:
備注:
fast_sky@sina.com
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;
}