分享 万年历!程序
时间:10-02
整理:3721RD
点击:
#include<stdio.h>
typedef unsigned int uint;//输入时间月份与年份都需要减1,输出的月份与年份都需要加1
typedef unsigned long int ulint;
uint a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
uint b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
uint count=10000;//记录计数器的值,从0开始
uint run_ping(uint year)//判断是闰年还是平年,返回1是闰年,返回0是平年
{ uint i;
if(year%4==0)//判断能否被4整除
{
if(year%100==0)//判断能否被100整除
{
if(year%400==0)//判断能否被400整除
{
i=1;
}
else
{
i=0;
}
}
else
{
i=1;
}
}
else
{
i=0;
}
return i;
}
ulint set_time(uint year,uint month,uint day,uint hour,uint min,uint second)//设置当前计数器的初值
{
ulint sec=0,i=0,x=0;
if(run_ping(year))//判断是平年还是闰年
{
for(i=1;i<month;i++)//闰年
{
sec+=(a*86400);//当前月份的总时间
}
sec=366*(year-1)*86400+sec+day*86400+hour*3600+min*60+second;//初始化的时间化成秒,化简成计数器的初始值,当前月份12则实际只有11个月完整,第12月没过
}
else
{
for(i=1;i<month;i++)//平年月份值化成总秒
{
sec+=(a*86400);//如果超出2月份的话,就多加了一天
}
if(month>2)//因为平年的2月28天
{
sec=365*(year-1)*86400+sec+day*86400+hour*3600+min*60+second;//多加了一天必须得减去。
}
else
{
sec=365*(year-1)*86400+sec+day*86400+hour*3600+min*60+second;//没有过2月不用减去多去的一天,年月日时分秒
}
}
return sec;
}
ulint current_time(void)//开始当前的时间,一般在初始化一个变量的时候,一定要先赋值为0,否则可能出现预想不到的情况
{
ulint time=0,year=0,month=0,second=0,hour=0,min=0,i=0,day=0;
long int day_month=0;
time=set_time(130,5,20,12,0,0)+count;//当前的时间总秒,年份不能太长可能超过数据长度,
if(run_ping(18))
{
year=time/86400/366;//输出时year需要加1,获取年份,一天86400s
day_month=time/86400%366;//月份加天数
do
{
day_month-=a[++i];
}while(day_month>0);
month=i;//获取当前的月份
day=day_month+a;//获取日期
}
else
{
year=time/86400/365;//输出时year需要加1,获取年份,time/86400代表整数天数,求余代表小时加秒数
day_month=time/86400%365;//月份加天数
do
{
day_month-=b[++i];
}while(day_month>0);
month=i;//获取当前的月份
day=day_month+a;//获取日期
}
hour=time%86400/3600;//当前的小时
min =time%86400%3600/60;//分钟数
second=time%86400%3600%60;//秒数
return year+1;//时分秒正确,数据长度问题,数据有无符号问题
}
void main(void)
{
ulint dat1;
dat1=current_time();
//dat1=set_time(1,2,1,1,0,10);
printf("%d",dat1);
}
typedef unsigned int uint;//输入时间月份与年份都需要减1,输出的月份与年份都需要加1
typedef unsigned long int ulint;
uint a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
uint b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
uint count=10000;//记录计数器的值,从0开始
uint run_ping(uint year)//判断是闰年还是平年,返回1是闰年,返回0是平年
{ uint i;
if(year%4==0)//判断能否被4整除
{
if(year%100==0)//判断能否被100整除
{
if(year%400==0)//判断能否被400整除
{
i=1;
}
else
{
i=0;
}
}
else
{
i=1;
}
}
else
{
i=0;
}
return i;
}
ulint set_time(uint year,uint month,uint day,uint hour,uint min,uint second)//设置当前计数器的初值
{
ulint sec=0,i=0,x=0;
if(run_ping(year))//判断是平年还是闰年
{
for(i=1;i<month;i++)//闰年
{
sec+=(a*86400);//当前月份的总时间
}
sec=366*(year-1)*86400+sec+day*86400+hour*3600+min*60+second;//初始化的时间化成秒,化简成计数器的初始值,当前月份12则实际只有11个月完整,第12月没过
}
else
{
for(i=1;i<month;i++)//平年月份值化成总秒
{
sec+=(a*86400);//如果超出2月份的话,就多加了一天
}
if(month>2)//因为平年的2月28天
{
sec=365*(year-1)*86400+sec+day*86400+hour*3600+min*60+second;//多加了一天必须得减去。
}
else
{
sec=365*(year-1)*86400+sec+day*86400+hour*3600+min*60+second;//没有过2月不用减去多去的一天,年月日时分秒
}
}
return sec;
}
ulint current_time(void)//开始当前的时间,一般在初始化一个变量的时候,一定要先赋值为0,否则可能出现预想不到的情况
{
ulint time=0,year=0,month=0,second=0,hour=0,min=0,i=0,day=0;
long int day_month=0;
time=set_time(130,5,20,12,0,0)+count;//当前的时间总秒,年份不能太长可能超过数据长度,
if(run_ping(18))
{
year=time/86400/366;//输出时year需要加1,获取年份,一天86400s
day_month=time/86400%366;//月份加天数
do
{
day_month-=a[++i];
}while(day_month>0);
month=i;//获取当前的月份
day=day_month+a;//获取日期
}
else
{
year=time/86400/365;//输出时year需要加1,获取年份,time/86400代表整数天数,求余代表小时加秒数
day_month=time/86400%365;//月份加天数
do
{
day_month-=b[++i];
}while(day_month>0);
month=i;//获取当前的月份
day=day_month+a;//获取日期
}
hour=time%86400/3600;//当前的小时
min =time%86400%3600/60;//分钟数
second=time%86400%3600%60;//秒数
return year+1;//时分秒正确,数据长度问题,数据有无符号问题
}
void main(void)
{
ulint dat1;
dat1=current_time();
//dat1=set_time(1,2,1,1,0,10);
printf("%d",dat1);
}
很不错的哦。
很好,学习啦