微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 分享 万年历!程序

分享 万年历!程序

时间: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);
}

很不错的哦。

很好,学习啦

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top