/*
* Date : 2015.08.13
* For : 1.计算从固定时间点 2010.1.1 以来的天数 2.计算两个普通日期之间相隔的天数
* Tool : Microsoft Visual Studio 2013
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctime>
void currenttime(time_t t, int &nowyear, int &nowmonth, int &nowday, int &nowyearday)
{
tm *nowtime = localtime(&t);
nowyear = nowtime->tm_year + 1900;
nowmonth = nowtime->tm_mon + 1;
nowday = nowtime->tm_mday;
nowyearday = nowtime->tm_yday;
}
bool isleapyear(int year) //判断是否闰年
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
int daysofyear(int year) //一年的天数
{
if (!isleapyear(year))
return 365;
else
return 366;
}
int dayinyear(int year, int month, int day) //根据年月日,判断改天位于该年的第多少天
{
int daysinyear = 0;
switch (month - 1)
{
case 11:daysinyear += 30;
case 10:daysinyear += 31;
case 9: daysinyear += 30;
case 8: daysinyear += 31;
case 7: daysinyear += 31;
case 6: daysinyear += 30;
case 5: daysinyear += 31;
case 4: daysinyear += 30;
case 3: daysinyear += 31;
case 2: daysinyear += 28;
case 1: daysinyear += 31;
break;
default:
break;
}
if (isleapyear(year) && month > 2)
daysinyear++;
daysinyear += day;
return daysinyear;
}
int totalfixeddays() //固定时间点的天数计算
{
int beginyear = 2010, beginmonth = 1, beginday = 1;
int nowyear, nowmonth, nowday, nowyearday;
int totaldays = 0;
currenttime(time(NULL), nowyear, nowmonth, nowday, nowyearday);
printf(" *************************************************\n");
printf(" * *\n");
printf(" * 固定时间间隔 *\n");
printf(" * Begin:2010. 1. 1 *\n");
printf(" * Today:%d.%2d.%2d *\n", nowyear, nowmonth, nowday);
printf(" * *\n");
printf(" *************************************************\n");
printf(" * *\n");
for (int year = beginyear; year < nowyear; year++)
totaldays += daysofyear(year);
int oldyeardays = dayinyear(beginyear, beginmonth, beginday);
totaldays = totaldays + nowyearday - oldyeardays + 1;
return totaldays;
}
int totalcommondays() //两个普通时间点的天数计算
{
int oldyear, oldmonth, oldday, newyear, newmonth, newday;
int totaldays = -1;
printf(" * 请输入两个时间点(年 月 日) 空格间隔 *\n");
scanf("%d%d%d%d%d%d", &oldyear, &oldmonth, &oldday, &newyear, &newmonth, &newday);
if (oldyear <= newyear)
{
totaldays += 1;
for (int year = oldyear; year < newyear; year ++)
{
totaldays += daysofyear(year);
}
totaldays = totaldays + dayinyear(newyear, newmonth, newday) - dayinyear(oldyear, oldmonth, oldday);
}
printf(" *************************************************\n");
printf(" * *\n");
printf(" * 起始时间 *\n");
printf(" * Begin:%d.%2d.%2d *\n", oldyear, oldmonth, oldday);
printf(" * Until:%d.%2d.%2d *\n", newyear, newmonth, newday);
printf(" * *\n");
printf(" *************************************************\n");
printf(" * *\n");
return totaldays;
}
void print_fixeddays() //输出固定时间间隔
{
printf(" * Together :%5d 天 *\n", totalfixeddays());
printf(" * *\n");
printf(" *************************************************\n");
}
void print_commondays() //输出普通时间间隔
{
int days = totalcommondays();
if (days >= 0)
printf(" * Together :%5d 天 *\n", days);
else
printf(" * Error : Begin days is later than End days *\n");
printf(" * *\n");
printf(" *************************************************\n");
}
void print(int choose) //输出函数
{
switch (choose)
{
case 1:
print_fixeddays();
break;
case 2:
print_commondays();
break;
default:
printf(" Wrong input number !\n\n");
break;
}
}
int main()
{
printf(" **输入指令:1(固定天数计算) 2(普通天数计算)**\n");
int choose;
scanf("%d", &choose);
print(choose);
system("pause");
return 0;
}
两个 年月日 之间的天数计算
最新推荐文章于 2022-04-26 15:59:46 发布