c语言计算天数与星期值,C语言实现时间差、星期、天数算日期(转)

这篇博客分享了C++实现的日期操作函数,包括计算两个日期之间的差值、判断是否为闰年、将字符串日期转化为结构体格式、计算某年日期的星期几,以及从当前日期向前或向后推算指定天数后的日期。代码简洁高效,适用于各种日期计算需求。
摘要由CSDN通过智能技术生成

最近因为一个项目需要,默认一个时间值,即当天的前一天日期,顺手就将其他的几个功能一并实现了,主要为

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

#include

#include

#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) &&

原文:http://www.cnblogs.com/15157737693zsp/p/4847548.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值