用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

日期

2016-06-28 作者: stopshooting举报

[c]代码库

/***************************************************************************************
建立头文件"date.h"
****************************************************************************************/
#ifndef __DATE_H
#define __DATE_H

#include "stm8_macro.h"
#include "ds1302.h"

long DaysApart(u16 year1, u8 month1, u8 day1, u16 year2, u8 month2, u8 day2);
u8   GetDayofWeek(u16 year, u8 month, u8 day);
void DateStep(u16* year, u8* month, u8* day);
void DateBack(u16* year, u8* month, u8* day);

#endif /* __TIME_DATE_H */

/***************************************************************************************
建立源文件"date.c"
****************************************************************************************/
#include "date.h"

/*
 @Function : 是否是闰年
 @Input    : year 年份
 @Output   : 1    闰年
             0    平年
 **/
static u8 IsLeapYear(u16 year)
{
	if( (year%100 == 0 && year%400 == 0) || 
	    (year%100 != 0 && year%4   == 0)   )
	{
		return 1;
	}
	else
		return 0;
}

/*
 @Function : 计算某个月份的天数
 @Input    : year  年份
             month 月份
 @Output   : 天数
 **/
static u8 GetDaysInMonth(u16 year, u8 month)
{
	u8 days = 0;

	switch(month)
	{
		case 2:
			if(IsLeapYear(year))
				days = 29;
			else
				days = 28;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			days = 30;
			break;
		default:
			days = 31;
			break;
	}
	return days;
}

/*
 @Function:  计算两个日期相隔天数,年份
 @Input   :  year1,month1,day1  日期1
			  year2, month2, day2  日期2
 @Output  :  0xffff: 出错
		      other : 两个日期相隔的天数,日期2 - 日期1
		        < 0 : 表示日期1 > 日期2
 **/
long DaysApart(
 u16 year1, u8 month1, u8 day1,
 u16 year2, u8 month2, u8 day2)
{
	u16  i;
	long res_days = 0;

	//日期格式错误,error
	if( month1 >12 ||  month2 >12 ||
	    day1   >31 ||  day2   >31 ||
	   !year1      || !year2      ||
	   !month1     || !month2     ||
	   !day1       || !day2        )
	{
		return 0xffff;
	}

	//日期1比日期2后
	if( ( year1 > year2) || 
	    ((year1 == year2) && (month1 > month2)) ||
	    ((year1 == year2) && (month1 == month2) && (day1 > day2)))
	{
		res_days = -1 * DaysApart(year2, month2, day2,
			                      year1, month1, day1);
		return res_days;
	}

	//天数计算
	if(year1 != year2)//不同年份
	{
		//第一年的天数
		res_days = GetDaysInMonth(year1, month1) - day1;
		for(i=month1+1; i<=12; i++)
		{
			res_days += GetDaysInMonth(year1, (u8)i);
		}
		//最后一年的天数
		for(i=1; i<month2; i++)
		{
			res_days += GetDaysInMonth(year2, (u8)i);
		}
		res_days += day2;
		//中间年份天数
		for(i=year1+1; i<year2; i++)
		{
			if(IsLeapYear((u16)i))
				res_days += 366;
			else
				res_days += 365;
		}
	}
	else//相同年份
	{
		if(month1 != month2)//不同月份
		{
			res_days = GetDaysInMonth(year1, month1) - day1 + day2;
			for(i=month1+1; i<month2; i++)
			{
				res_days += GetDaysInMonth(year1, (u8)i);
			}
		}
		else//相同月份
		{
			res_days = day2 - day1;
		}
	}
	return res_days;
}

/*
 @Function: 获取星期几
 @Input   : year month day,日期须大于公元1世纪.01.01
 @Output  : 星期  1~7
 **/
u8 GetDayofWeek(u16 year, u8 month, u8 day)
{
	long days = 0;
	u8   dayofweek;

	days = DaysApart(2001, 1,  1, //2001.01.01,星期一,以此作参照
					 year, month, day);
	if(days >= 0)
	{
		dayofweek = (u8)((days + 1)%7);
		if(dayofweek == 0)
			dayofweek = 7;
	}
	else
	{
		dayofweek = (u8)((-1*days)%7);
		dayofweek = (u8)((dayofweek == 0)?(1):((8-dayofweek)));
	}
	return dayofweek;
}

/*
 @Function: 日期步进,日期前进一天
 @Input   : year month day
 @Output  : None
 **/
void DateStep(u16* year, u8* month, u8* day)
{
	u8 daysofMonth;

	daysofMonth = GetDaysInMonth(*year, *month);

	if(++(*day) > daysofMonth)
	{
		*day = 1;
		if(++(*month) > 12)
		{
			*month = 1;
			++(*year);
		}
	}
}

/*
 @Function: 日期步进,日期倒退一天
 @Input   : year month day
 @Output  : None
 **/
void DateBack(u16* year, u8* month, u8* day)
{
	if(--(*day) == 0)
	{
		if(--(*month) == 0)
		{
			*month = 12;
			--(*year);
		}
		*day = GetDaysInMonth(*year, *month);
	}
}




网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...