切换到宽版
爱科技/爱创意/爱折腾;电子/数码爱好者的家!欢迎访问新版数码之家网站
  • 3829阅读
  • 2回复

[C51]给大家分享一下c51知utc时间计算年月日的函数 [复制链接]

上一主题 下一主题
离线llcc
 

发帖
160
M币
2527
专家
8
粉丝
11
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2016-08-22
utc时间,是从1970年1月1日开始到现在的秒数,我之前弄wifi钟用ntp协议得到标准时间,的确很准,但计算年月日很伤脑筋,现在分享给大家,这个程序需要先给变量 epoch即utc时间赋值,然后运行get()函数,最后就可以取年(Year)月(Month)日(Day)星期(week)啦,不知道准不准,到现在还未发现问题
使用这个算法的作品http://bbs.mydigit.cn/read.php?tid=1778733

程序如下,为了方便,直接贴出来




#define time_zone 8   //时区(要格林尼治时间加减的小时,北京为东八区,要将格林威治时间+8小时)
unsigned long epoch;//utc时间,即1970年1月1日到现在的秒数,计算前赋值
unsigned long Time = time_zone * 3600 + epoch;//计算加了时区后的时间
unsigned long Y2KTime = (Time - 946684800) / 86400;//从2000年开始的天数,这样方便计算
unsigned long YTime;//从今年开始的天数

//以下为计算后取数值用
unsigned int Year;//年变量
unsigned int Month = 0;//月变量
unsigned long Day;//日变量
unsigned char week;//星期变量


unsigned char LY(unsigned int y)//判断是否为闰年
{
  if (y % 400 == 0)
    return 1;
  if (y % 100 == 0)
    return 0;
  if (y % 4 == 0)
    return 1;
}
void get()//计算年月日
{
    
      //日期
      if (Y2KTime % 146097 <= 36525)//如果是2000-2100,2400-2500…年,2000,2400年为闰年
      {
        Year = 2000 + Y2KTime / 146097 * 400 + Y2KTime % 146097 / 1461 * 4 + (Y2KTime % 146097 % 1461 - 1) / 365;
        YTime = (Y2KTime % 146097 % 1461 - 1) % 365 + 1;
      }
      else
      {
        Year = 2000 + Y2KTime / 146097 * 400 + (Y2KTime % 146097 - 1) / 36524 * 100 + ((Y2KTime % 146097 - 1) % 36524 + 1) / 1461 * 4 + (((Y2KTime % 146097 - 1) % 36524 + 1) % 1461 - 1) / 365;
        YTime = (((Y2KTime % 146097 - 1) % 36524 + 1) % 1461 - 1) % 365 + 1;
      }
      Day = YTime;
      unsigned char f = 1; //循环标志
      while (f)//循环,每次减不同月份的天数,如果减到合适的天数,月份即为已减月数加一
      {
        switch (Month)
        {
          case 0:
            if (Day < 31)
              f = 0;
            else
              Day -= 31;
            break;
          case 1:
            if (Day < 29)
              f = 0;
            else
            {
              if (LY(Year))
              {
                Day -= 29;
              }
              else
              {
                Day -= 28;
              }
            }
            break;
          case 2:
            if (Day < 31)
              f = 0;
            else
              Day -= 31;
            break;
          case 3:
            if (Day < 30)
              f = 0;
            else
              Day -= 30;
            break;
          case 4:
            if (Day < 31)
              f = 0;
            else
              Day -= 31;
            break;
          case 5:
            if (Day < 30)
              f = 0;
            else
              Day -= 30;
            break;
          case 6:
            if (Day < 31)
              f = 0;
            else
              Day -= 31;
            break;
          case 7:
            if (Day < 31)
              f = 0;
            else
              Day -= 31;
            break;
          case 8:
            if (Day < 30)
              f = 0;
            else
              Day -= 30;
            break;
          case 9:
            if (Day < 31)
              f = 0;
            else
              Day -= 31;
            break;
          case 10:
            if (Day < 30)
              f = 0;
            else
              Day -= 30;
            break;
          case 11:
            if (Day < 31)
              f = 0;
            else
              Day -= 31;
            break;
        }
        Month += 1;
      }
      Day += 1;//序数开始是0,日期开始是1,故要加一


      //星期
      switch (Y2KTime % 7) //2000年1月1日是星期六
      {
        case 0: week = 6; break;
        case 1: week = 7; break;
        case 2: week = 1; break;
        case 3: week = 2; break;
        case 4: week = 3; break;
        case 5: week = 4; break;
        case 6: week = 5; break;
      }
}

内容来自Android手机客户端

本帖最近打赏记录:共4条打赏M币+29
M币换购:大丈夫能屈能伸!数码之家22合一拆机工具(拆客必备系列)
 
离线decai

发帖
799
M币
6231
专家
13
粉丝
144
只看该作者 1楼 发表于: 2016-08-23
其实在keil中已经有一个文件全给你做好了.
包含一下time.h就能用.
离线llcc

发帖
160
M币
2527
专家
8
粉丝
11
只看该作者 2楼 发表于: 2016-08-23
decai:其实在keil中已经有一个文件全给你做好了.
包含一下time.h就能用. (2016-08-23 09:11) 

谢谢,我还不知道呢,那arduino ide中有这个有文件吗?

内容来自Android手机客户端

快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个