码迷,mamicode.com
首页 > 其他好文 > 详细

日期模块的实现

时间:2015-01-16 01:24:16      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:c语言

#include "date.h"


/* 判断是否是闰年,函数放回为1表示是闰年,函数返回为0为非闰年 */

UINT32 Is_Leap_Year(
	   UINT32 u32_year
	   )

{
	UINT32 u32_Leap = 0u, u32_day = 0u;
	 /* 能被四整除并且不能被100整除,或者能被400 */
	if (((0u == (u32_year % 4u)) && ((u32_year % 100u) != 0u)) || (( u32_year % 400u) == 0u))
	{
		/* OSM_Printf是闰年 */
		u32_Leap = 1u;
		u32_day = 366u;
	}
	else
	{
		/* 不是闰年 */
		u32_Leap = 0u;
		u32_day = 365u;
	}
	return u32_Leap;
}

/* 2、输入一个日期如:20110415,判断是星期几 */
UINT32 Week(
	   UINT32 year_u32,
	   UINT32 mouth_u32,
	   UINT32 day_u32
	   )

{
	UINT32 day_code = 0u;
	UINT32 i32i = 0u;
	UINT32 u32_j = 0u;
	UINT32 year_flag = 0u;
	UINT32 days = 0u;
	UINT32 i32_sum = 0u;
	UINT32 MOUTH[12] = {30u, 28u, 31u, 30u, 31u, 30u, 31u, 31u, 30u, 31u, 30u, 31u};

	if ( (mouth_u32 < 1u) || (mouth_u32 > 12u) || (day_u32 > 31u) || (year_u32 < 1900u))
	{
		(void)OSM_Printf("输入有误的数据");
	}
	else
	{
		
		if ( 1900U == year_u32 )
		{
			u32_j = (days + day_u32) % 7u;
		}
		else
		{
			for ( i32i = 1900u ; i32i < year_u32; i32i++)
			{
				year_flag = Is_Leap_Year(i32i);
				if ( 1u == year_flag)
				{
					days += 366u; 
				}
				else
				{
					days += 365u;
				}
			}

			for ( i32i = 0u; i32i < (mouth_u32 - 1u); i32i++)
			{
				days += MOUTH[i32i];
			}
			u32_j = (days + day_u32) % 7u;
		}

		switch(u32_j)
		{
			case 0u:
				(void)OSM_Printf("星期日\n");
				break;
			case 1u:
				(void)OSM_Printf("星期一\n");
				break;
			case 2u:
				(void)OSM_Printf("星期二\n");
				break;
			case 3u:
				(void)OSM_Printf("星期三\n");
				break;
			case 4u:
				(void)OSM_Printf("星期四\n");
				break;
			case 5u:
				(void)OSM_Printf("星期五\n");
				break;
			case 6u:
				(void)OSM_Printf("星期六\n");
				break;
			default:
				break;
		} 
	}
	return 0u;
}

/* 3、两个指定的日期间相隔多少天,如:20110415距离19880906相隔多少天 */ 
/* 思路:分别求出两个日期距离1900年1月1日的天数,然后求出连个之间的差值 */
/*	求出一个日期1990年以后的包括1990年与1990年1月1日的距离 */
UINT32 Distance(
	  UINT32 year_u32,
      UINT32 mouth_u32,
	  UINT32 day_u32
	  )

{
	UINT32 distance_to_u32 = 0u;
	UINT32 i32i = 0u;
	UINT32 year_flag = 0u;
	UINT32 MOUTH[12] = {30u, 28u, 31u, 30u, 31u, 30u, 31u, 31u, 30u, 31u, 30u, 31u};
	if ( (mouth_u32 < 1u) || (mouth_u32 > 12u) || (day_u32 > 31u) || (year_u32 < 1900u))
	{
		(void)OSM_Printf("输入有误的数据");
	}
	else
	{
		if ( 1900u == year_u32 )
		{
			if ( 1u != mouth_u32 )
			{
				for ( i32i = 0u; i32i < (mouth_u32 - 1u); i32i++)
				{
					distance_to_u32 += MOUTH[i32i];
				}
			}
			distance_to_u32 += day_u32;
		}
		else
		{
			for ( i32i = 1900u ; i32i < year_u32; i32i++)
			{
				year_flag = Is_Leap_Year(i32i);
				if ( 1u == year_flag)
				{
					distance_to_u32 += 366u; 
				}
				else
				{
					distance_to_u32 += 365u;
				}
			}
			for ( i32i = 0u; i32i < (mouth_u32 - 1u); i32i++)
			{
				distance_to_u32 += MOUTH[i32i];
			}
		}
	}
	return distance_to_u32;
}

/* 求出两个日期之间的距离 */
UINT32 Absolue_distance(
	  UINT32 year1_u32,
	  UINT32 mouth1_u32,
	  UINT32 day1_u32,
	  UINT32 year2_u32,
	  UINT32 mouth2_u32,
	  UINT32 day2_u32
	  )

{
	UINT32 absolue_distance = 0u;
	UINT32 distance1 = 0u;
	UINT32 distance2 = 0u;
	distance1 = Distance(year1_u32, mouth1_u32, day1_u32);
	distance2 = Distance(year2_u32, mouth2_u32, day2_u32);
	if ( distance1 > distance2)
	{
		absolue_distance = distance1 - distance2;
	}
	else 
	{
		absolue_distance = distance2 - distance1;
	}
	(void)OSM_Printf("%d",absolue_distance);
	return absolue_distance;
}

/* 4、实现日期的格式化输出方式如YYYYMMDD, YYMMDD */
UINT32 Formatout1(
	   UINT32 year_u32,
	   UINT32 mouth_u32,
	   UINT32 day_u32
	   )

{
	if((NULL != year_u32) || (NULL != mouth_u32) || (NULL != day_u32))
	{
		(void)OSM_Printf("YYYYMMDD的形式:%04d%02d%02d\n",year_u32,mouth_u32,day_u32);
		(void)OSM_Printf("YYMMDD的形式:%02d%02d%02d\n",(year_u32 % 100U),mouth_u32,day_u32);
	}
	else
	{
		(void)OSM_Printf("输入有误");
	}
	return 0u;
}

主函数


#include "date.h"

UINT32 main(void)
{
	UINT32 u32_year1 = 0u;	
	UINT32 u32_year2 = 0u;
	UINT32 u32_mouth1 = 0u;
	UINT32 u32_mouth2 = 0u;
	UINT32 u32_day1 = 0u;
	UINT32 u32_day2 = 0u;
	UINT32 flag = 0u;
	UINT32 distance_abs = 0u;
	UINT32 key = 0u;
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~~实战四~~~~~~~~~~~~~~~~~~~~~\n");
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~功能菜单~~~~~~~~~~~~~~~~~~~~\n");
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~功能菜单~~~~~~~~~~~~~~~~~~~~\n");
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~1、闰年判断~~~~~~~~~~~~~~~~~\n");
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~2、星期判断~~~~~~~~~~~~~~~~~\n");
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~3、日期间隔~~~~~~~~~~~~~~~~~\n");
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~4、格式输出~~~~~~~~~~~~~~~~~\n");
	(void)OSM_Printf("~~~~~~~~~~~~~~~~~输入相应的数字~~~~~~~~~~~~~~\n");
	
	(void)OSM_Scanf("%d", &key);
	if ( key < 1 || key > 4)
	{
		(void)OSM_Printf("输入错误了!");
	}
	switch (key)
	{
	case 1u:
		(void)OSM_Printf("输入年份\n");
		(void)OSM_Scanf("%d", &u32_year1);
		flag = Is_Leap_Year(u32_year1);
		if ( 1u == flag)
		{
			(void)OSM_Printf("是闰年\n");
		}
		if ( 0u == flag)
		{
			(void)OSM_Printf("不是闰年\n");
		}
		break;
	case 2u:
		(void)OSM_Printf("请输入年月日:\n");
		(void)OSM_Scanf("%4d%2d%2d",&u32_year1, &u32_mouth1, &u32_day1);
		(void)Week(u32_year1, u32_mouth1, u32_day1);
		break;
	case 3u:
		(void)OSM_Printf("请输入第一个日期:\n");
		(void)OSM_Scanf("%4d%2d%2d",&u32_year1, &u32_mouth1, &u32_day1);
		(void)OSM_Printf("请输入第二个日期:\n");
		(void)OSM_Scanf("%4d%2d%2d",&u32_year2, &u32_mouth2, &u32_day2);
		(void)Absolue_distance( u32_year1, u32_mouth1, u32_day1, u32_year2, u32_mouth2, u32_day2);
		break;
	case 4u:
		(void)OSM_Printf("请输入年月日:\n");
		(void)OSM_Scanf("%4d%2d%2d",&u32_year1, &u32_mouth1, &u32_day1);
		(void)Formatout1(u32_year1, u32_mouth1, u32_day1);
		break;
	default:
		break;
	}
	return 0u;
}
技术分享

日期模块的实现

标签:c语言

原文地址:http://blog.csdn.net/u011046042/article/details/42756763

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!