hi55234 发表于 2014-3-24 22:10:44

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

本帖最后由 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的倍数为闰年。

hi55234 发表于 2014-3-24 23:06:38

本帖最后由 hi55234 于 2014-3-25 22:08 编辑



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

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

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

}else{

//判断大小月
for(int col=0;col<4;col++){
if(xiaoyue==utc8y)xiaoyueok=1;
}

if(xiaoyueok && utc8r==30){ //小月最后一天
utc8r=1;
yuejinwei=1;
}else if(!xiaoyueok && utc8r==31){ //大月最后一天
utc8r=1;
yuejinwei=1;
}else{
utc8r++;//剩下的情况自加1就可以了
}
}

}

if(yuejinwei && utc8y==12){ //最后一月
utc8y=1;
nianjinwei=1;
}else if(yuejinwei){
utc8y++;
}


if(nianjinwei)utc8n++;

davidce 发表于 2014-3-24 23:06:57

arduino 有time库,剩下的事情可以交给它

hi55234 发表于 2014-3-24 23:11:21

davidce 发表于 2014-3-24 23:06 static/image/common/back.gif
arduino 有time库,剩下的事情可以交给它

没看到什么time库啊?

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

davidce 发表于 2014-3-24 23:27:38

#include <Time.h>

日期时间库

davidce 发表于 2014-3-24 23:28:33

另外DS1037 的电池是充电电池

shihaipeng04 发表于 2014-3-25 00:52:46

肯定会有这种库文件。 另外计算日期的公式也不是很难。 4年一润,100年一不润啥的。好像basic里总有这种例题。很好找到的。

shihaipeng04 发表于 2014-3-25 01:00:48

搬的

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

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

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

        YY        =        *DT;                                        //获取年
        MM        =        *(DT+1);                                //获取月
        DD        =        *(DT+2);                                //获取日
        hh        =        *(DT+3);                                //获取时
        mm        =        *(DT+4);                                //获取分
        ss        =        *(DT+5);                                //获取秒

        if(AREA)                                                //东(+)时区处理
        {
                if(hh+GMT<24)        hh        +=        GMT;//如果与格林尼治时间处于同一天则仅加小时即可
                else                                                //如果已经晚于格林尼治时间1天则进行日期处理
                {
                        hh        =        hh+GMT-24;                //先得出时间
                        if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10)        //大月份(12月单独处理)
                        {
                                if(DD<31)        DD++;
                                else
                                {
                                        DD        =        1;
                                        MM        ++;
                                }
                        }
                        else if(MM==4 || MM==6 || MM==9 || MM==11)                                //小月份2月单独处理)
                        {
                                if(DD<30)        DD++;
                                else
                                {
                                        DD        =        1;
                                        MM        ++;
                                }
                        }
                        else if(MM==2)        //处理2月份
                        {
                                if((DD==29) || (DD==28 && IsLeapYear(YY)==0))                //本来是闰年且是2月29日 或者不是闰年且是2月28日
                                {
                                        DD        =        1;
                                        MM        ++;
                                }
                                else        DD++;
                        }
                        else if(MM==12)        //处理12月份
                        {
                                if(DD<31)        DD++;
                                else                //跨年最后一天
                                {                          
                                        DD        =        1;
                                        MM        =        1;
                                        YY        ++;
                                }
                        }
                }
        }
        else
        {       
                if(hh>=GMT)        hh        -=        GMT;        //如果与格林尼治时间处于同一天则仅减小时即可
                else                                                //如果已经早于格林尼治时间1天则进行日期处理
                {
                        hh        =        hh+24-GMT;                //先得出时间
                        if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11)        //上月是大月份(1月单独处理)
                        {
                                if(DD>1)        DD--;
                                else
                                {
                                        DD        =        31;
                                        MM        --;
                                }
                        }
                        else if(MM==5 || MM==7 || MM==10 || MM==12)                                //上月是小月份2月单独处理)
                        {
                                if(DD>1)        DD--;
                                else
                                {
                                        DD        =        30;
                                        MM        --;
                                }
                        }
                        else if(MM==3)        //处理上个月是2月份
                        {
                                if((DD==1) && IsLeapYear(YY)==0)                                        //不是闰年
                                {
                                        DD        =        28;
                                        MM        --;
                                }
                                else        DD--;
                        }
                        else if(MM==1)        //处理1月份
                        {
                                if(DD>1)        DD--;
                                else                //新年第一天
                                {                          
                                        DD        =        31;
                                        MM        =        12;
                                        YY        --;
                                }
                        }
                }
        }              

        *DT        =        YY;                                        //更新年
        *(DT+1)        =        MM;                                //更新月
        *(DT+2)        =        DD;                                //更新日
        *(DT+3)        =        hh;                                //更新时
        *(DT+4)        =        mm;                                //更新分
        *(DT+5)        =        ss;                                //更新秒
}

huangshan78 发表于 2014-4-26 01:16:25

我想问问如何做一个arduino gps授时的时钟
页: [1]
查看完整版本: gps 授时时的日期转换问题,大家怎么解决的?