N天前的日期

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<memory.h>
#define DEBUG
int g_year[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//非闰年

struct Date
{
	int Year;
	int Month;
	int Day;
};

Date g_data;
bool re_Leap(int year)
{
	if (year % 4 == 0)
	{
		if (year % 100 == 0)
		{
			// 这里如果被 400 整数是闰年
			if (year % 400 == 0)
				return true;
			else
				return false;
		}
		else
			return true;
	}
	else
		return false;
}

void re_year(time_t t)
{
	struct tm *tp;
	time(&t);
	tp = gmtime(&t);
	g_data.Year = 1900 + tp->tm_year;
	g_data.Month = 1 + tp->tm_mon;
	g_data.Day = tp->tm_mday;
}

Date ne_year(int days,int month,int year)
{
	days = days - g_data.Day ;

	int j = month - 1;

	while (days - g_year[j -1 ] >= 0 && j > 0)
	{
		days -= g_year[j -1];
		j--;
	}

	j = 12;//跨年了

	if (re_Leap(year - 1)) //是闰年
	{
		g_year[1] = 29;
	}
	else
	{
		g_year[1] = 28;
	}
	//days++;
	while (days - g_year[j-1] > 0 && j > g_data.Month)
	{
		days -= g_year[j-1];
		j--;
	}

	days = g_year[j-1] - days;

	if (days != 0)
	{
		Date d = { year - 1,j,days };
		return d;
	}
	else
	{
		Date d = { year - 1,j-1 ,g_year[j  - 1] };
		return d;
	}
}


Date no_ne_year(int days, int month, int year)
{

	days = days - g_data.Day;

	int j = month-1;

	while (days - g_year[j-1] > 0)
	{
		days -= g_year[j-1];
		j--;
	}
	days = g_year[j-1] - days ;
	if (days != 0)
	{
		Date d = { year,j,days };
		return d;
	}
	else
	{
		Date d = { year,j-1,g_year[j - 2] };
		return d;
	}

}

Date no_one_month(int year,int days)
{
	int day = g_data.Day - days;
	if (day != 0)
	{
		Date d = { year,g_data.Month,day };
		return d;
	}
	else
	{
		Date d = { year,g_data.Month-1,g_year[g_data.Month-2] };
		return d;
	}

}

Date re_col(int year ,int days)
{
	
	int ny = 0;
	int month = 0;
	int day = 0;
	int sum = 0;
	if (days < 0) 
	{
		return *(Date*)(0);
	}
	else
	{
		if (re_Leap(year))//是闰年
		{
	        g_year[1] = 29;
			if (days >= 0 && days < 366)
			{
				month = g_data.Month;
				day = g_data.Day;
				for (int i = 1;i < month;i++)
				{
					sum += g_year[i];
				}
				sum += day;

				if (days > sum) //过年的
				{
					return ne_year(days,month,year);
				}
				else  
				{ 
					if (days > g_data.Day)
					{
						return no_ne_year(days, month, year);

					}
					else   //不足一个月
					{
						return no_one_month(year,days);
					}
				}
			}
			if (days >= 366)
			{
				return re_col(year-1, days - 366);
			}
		}
		else
		{
			if (days >= 0 && days < 365)
			{
				month = g_data.Month;
				day = g_data.Day;
				for (int i = 1;i < month;i++)
				{
					sum += g_year[i];
				}
				sum += day;

				if (days > sum) //过年的
				{
					return  ne_year(days, month, year);
				}
				else
				{
					if (days > g_data.Day)
					{
						return no_ne_year(days, month, year);	
					}
					else   //不足一个月
					{
						return no_one_month(year,days);
						
					}

				}   //不跨年
			}

			if (days >= 365)
			{
				return re_col(year - 1, days - 365);
			}
		}
	}
}


int main()
{
	re_year(NULL);
	int s;
#ifdef DEBUG
	FILE *f = fopen("test.txt", "a+");
	char buf[256] = { 0 };
	for (int i=0;i< 9999;i++)
	{
		Date p = re_col(g_data.Year, i);
		sprintf(buf,"\n %d---------------->%d-%d-%d", i, p.Year, p.Month, p.Day);
		fputs(buf,f);
	}
	fclose(f);
#endif // DEBUG

#ifndef DEBUG
	while (1)
	{
		printf("\n|===========================BEGIN===============================|\n");
		scanf_s("%d", &s);
		Date p = re_col(g_data.Year, s);
		printf("\n%d-%d-%d", p.Year, p.Month, p.Day);
		printf("\n|============================END===============================|\n");
	}

#endif // !DEBUG

	getchar();
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值