极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14678|回复: 8

gps 授时时的日期转换问题,大家怎么解决的?

[复制链接]
发表于 2014-3-24 22:10:44 | 显示全部楼层 |阅读模式
本帖最后由 hi55234 于 2014-3-24 23:05 编辑

时间上 UTC + 8 取模就OK了

可日期上就比较蛋疼了,知道日期该该加一天很容易

可怎么确保不会出现入:3月32日这种神奇的日期~~~

换言之,即简单的判断闰年、平年、大月、小月的问题~~~~

菜鸟表示基础不牢,地动山遥~~~

--------------------------------------------------------------------------------

大月、小月:
    1月、3月、5月、7月、8月、10月、12月,这七个月都有31天,我们称有31天的月份为大月。
   4月、6月、9月、11月,这四个月都有30天,我们称有30天的月份为小月。

平年有365天,闰年有366天。通常每四年里有三个平年,有一个闰年,凡是4的倍数的年份通常都是闰年。当遇到整百年时,则规定逢400的倍数为闰年。
回复

使用道具 举报

 楼主| 发表于 2014-3-24 23:06:38 | 显示全部楼层
本帖最后由 hi55234 于 2014-3-25 22:08 编辑


  1. //UTC +8(北京时间)时、分、秒、年、月、日
  2. int utc8s,utc8f,utc8m,utc8n,utc8y,utc8r;
  3. //小月的数组
  4. int xiaoyue[5]={4,6,9,11};
  5. //日进位,月进位,年进位,大小月判断值
  6. boolean rijinwei,yuejinwei,nianjinwei,xiaoyueok;

  7. //讨论日、月、年进位(大月、小月、平年、闰年的问题)
  8. if(rijinwei){

  9. //先讨论2月的问题
  10. if(utc8y==2 && utc8r==28){
  11. if(utc8n%4==0)utc8r=29;//闰年可加一天
  12. else {
  13. utc8r=1;
  14. yuejinwei=1;
  15. }

  16. }else{

  17. //判断大小月
  18. for(int col=0;col<4;col++){
  19. if(xiaoyue[col]==utc8y)xiaoyueok=1;
  20. }

  21. if(xiaoyueok && utc8r==30){ //小月最后一天
  22. utc8r=1;
  23. yuejinwei=1;
  24. }else if(!xiaoyueok && utc8r==31){ //大月最后一天
  25. utc8r=1;
  26. yuejinwei=1;
  27. }else{
  28. utc8r++;//剩下的情况自加1就可以了
  29. }
  30. }

  31. }

  32. if(yuejinwei && utc8y==12){ //最后一月
  33. utc8y=1;
  34. nianjinwei=1;
  35. }else if(yuejinwei){
  36. utc8y++;
  37. }


  38. if(nianjinwei)utc8n++;
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-3-24 23:06:57 | 显示全部楼层
arduino 有time库,剩下的事情可以交给它
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-24 23:11:21 | 显示全部楼层
davidce 发表于 2014-3-24 23:06
arduino 有time库,剩下的事情可以交给它


没看到什么time库啊?

反正millis()不靠谱,而DS1037长时间不用,又存在电池耗尽,时间需要设置,相当麻烦,所以干脆搞成GPS自动授时好了
回复 支持 反对

使用道具 举报

发表于 2014-3-24 23:27:38 | 显示全部楼层
#include <Time.h>

日期时间库
回复 支持 反对

使用道具 举报

发表于 2014-3-24 23:28:33 | 显示全部楼层
另外DS1037 的电池是充电电池
回复 支持 反对

使用道具 举报

发表于 2014-3-25 00:52:46 | 显示全部楼层
肯定会有这种库文件。 另外计算日期的公式也不是很难。 4年一润,100年一不润啥的。好像basic里总有这种例题。很好找到的。
回复 支持 反对

使用道具 举报

发表于 2014-3-25 01:00:48 | 显示全部楼层
搬的

  1. /********************************************************************************************************
  2. **         函数名称:                        bit                IsLeapYear(uchar        iYear)
  3. **        功能描述:                        判断闰年(仅针对于2000以后的年份)
  4. **        入口参数:                        iYear        两位年数
  5. **        出口参数:                        bit                1:为闰年        0:为平年
  6. **        创 建 者:                        严泽远
  7. **        创建时间:                        2011-04-05 14:29
  8. **        版    本:                        v1.0.0
  9. ********************************************************************************************************/
  10. bit                IsLeapYear(uchar iYear)
  11. {
  12.         uint        Year;
  13.         Year        =        2000+iYear;
  14.         if((Year&3)==0)
  15.         {
  16.             return ((Year%400==0) || (Year%100!=0));
  17.         }
  18.         return 0;
  19. }

  20. /********************************************************************************************************
  21. **         函数名称:                        void        GMTconvert(uchar *DT,uchar GMT,bit AREA)
  22. **        功能描述:                        格林尼治时间换算世界各时区时间
  23. **        入口参数:                        *DT:        表示日期时间的数组 格式 YY,MM,DD,HH,MM,SS
  24. **                                                GMT:        时区数
  25. **                                                AREA:        1(+)东区 W0(-)西区
  26. **        创 建 者:                        严泽远
  27. **        创建时间:                        2011-04-05 14:08
  28. **        版    本:                        v1.0.0
  29. ********************************************************************************************************/
  30. void        GMTconvert(uchar *DT,uchar GMT,bit AREA)
  31. {
  32.         uchar        YY,MM,DD,hh,mm,ss;                //年月日时分秒暂存变量

  33.         if(GMT==0)        return;                                //如果处于0时区直接返回
  34.         if(GMT>12)        return;                                //时区最大为12 超过则返回                

  35.         YY        =        *DT;                                        //获取年
  36.         MM        =        *(DT+1);                                //获取月
  37.         DD        =        *(DT+2);                                //获取日
  38.         hh        =        *(DT+3);                                //获取时
  39.         mm        =        *(DT+4);                                //获取分
  40.         ss        =        *(DT+5);                                //获取秒

  41.         if(AREA)                                                //东(+)时区处理
  42.         {
  43.                 if(hh+GMT<24)        hh        +=        GMT;//如果与格林尼治时间处于同一天则仅加小时即可
  44.                 else                                                //如果已经晚于格林尼治时间1天则进行日期处理
  45.                 {
  46.                         hh        =        hh+GMT-24;                //先得出时间
  47.                         if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10)        //大月份(12月单独处理)
  48.                         {
  49.                                 if(DD<31)        DD++;
  50.                                 else
  51.                                 {
  52.                                         DD        =        1;
  53.                                         MM        ++;
  54.                                 }
  55.                         }
  56.                         else if(MM==4 || MM==6 || MM==9 || MM==11)                                //小月份2月单独处理)
  57.                         {
  58.                                 if(DD<30)        DD++;
  59.                                 else
  60.                                 {
  61.                                         DD        =        1;
  62.                                         MM        ++;
  63.                                 }
  64.                         }
  65.                         else if(MM==2)        //处理2月份
  66.                         {
  67.                                 if((DD==29) || (DD==28 && IsLeapYear(YY)==0))                //本来是闰年且是2月29日 或者不是闰年且是2月28日
  68.                                 {
  69.                                         DD        =        1;
  70.                                         MM        ++;
  71.                                 }
  72.                                 else        DD++;
  73.                         }
  74.                         else if(MM==12)        //处理12月份
  75.                         {
  76.                                 if(DD<31)        DD++;
  77.                                 else                //跨年最后一天
  78.                                 {                          
  79.                                         DD        =        1;
  80.                                         MM        =        1;
  81.                                         YY        ++;
  82.                                 }
  83.                         }
  84.                 }
  85.         }
  86.         else
  87.         {       
  88.                 if(hh>=GMT)        hh        -=        GMT;        //如果与格林尼治时间处于同一天则仅减小时即可
  89.                 else                                                //如果已经早于格林尼治时间1天则进行日期处理
  90.                 {
  91.                         hh        =        hh+24-GMT;                //先得出时间
  92.                         if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11)        //上月是大月份(1月单独处理)
  93.                         {
  94.                                 if(DD>1)        DD--;
  95.                                 else
  96.                                 {
  97.                                         DD        =        31;
  98.                                         MM        --;
  99.                                 }
  100.                         }
  101.                         else if(MM==5 || MM==7 || MM==10 || MM==12)                                //上月是小月份2月单独处理)
  102.                         {
  103.                                 if(DD>1)        DD--;
  104.                                 else
  105.                                 {
  106.                                         DD        =        30;
  107.                                         MM        --;
  108.                                 }
  109.                         }
  110.                         else if(MM==3)        //处理上个月是2月份
  111.                         {
  112.                                 if((DD==1) && IsLeapYear(YY)==0)                                        //不是闰年
  113.                                 {
  114.                                         DD        =        28;
  115.                                         MM        --;
  116.                                 }
  117.                                 else        DD--;
  118.                         }
  119.                         else if(MM==1)        //处理1月份
  120.                         {
  121.                                 if(DD>1)        DD--;
  122.                                 else                //新年第一天
  123.                                 {                          
  124.                                         DD        =        31;
  125.                                         MM        =        12;
  126.                                         YY        --;
  127.                                 }
  128.                         }
  129.                 }
  130.         }                

  131.         *DT        =        YY;                                        //更新年
  132.         *(DT+1)        =        MM;                                //更新月
  133.         *(DT+2)        =        DD;                                //更新日
  134.         *(DT+3)        =        hh;                                //更新时
  135.         *(DT+4)        =        mm;                                //更新分
  136.         *(DT+5)        =        ss;                                //更新秒
  137. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-4-26 01:16:25 | 显示全部楼层
我想问问如何做一个arduino gps授时的时钟
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-22 11:35 , Processed in 0.044382 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表