数码之家

 找回密码
 立即注册
搜索
查看: 671|回复: 0

[C51] 51单片机北京时间转时间戳

[复制链接]
发表于 2023-9-1 15:54:57 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jjy1039 于 2023-9-1 16:44 编辑

最近做一个定位器,服务器要求上传数据需要把当前时间转为时间戳,找了好几个都不太理想,决定自己写一个,菜鸟,请多多指点。

由于时间戳需要大量的long,所以很占用资源,用51单片机计算的时候,经常计算公式正确,但是结果错误,最后把月份那一部分需要计算的秒数提前计算好,直接用的数字。

已经在at89s51试过了,可以直接用,但还是希望有高手给指点优化一下,太占用资源了直接编译后,data=78.0 xdata=0 code=1188。

封装成函数了,不嫌弃写的糙的可以直接调用,比如time=unixtime("20501204010522");时间是从2021年1月1日0点开始计算的,可以计算大2099年12月31日,由于51单片机最大也就long,ffffffff的值,对应时间戳2106年,往后的就需要分段计算,资源就更不够了,因此本次没有涉及2100年后的计算。

直接粘贴代码,网站总是显示不全,后面有文件。

unsigned long unixtime(unsigned char *ntime) //输入需要转换的时间14位格式
{
    unsigned char timeb[14]="20210101000000";//起始时间
    unsigned char timedv[14];                //差异
    unsigned char nowtime[14];               //储存 *ntime 的值,直接指针运算总是出错,没有找到原因,最后转移到数组计算才正常
    unsigned long timeY;                     //年转秒
    unsigned long timeM;                     //月转杪
    unsigned long timeD;                     //日转秒
    unsigned long timeH;                     //时转秒
    unsigned int timeMIN;                    //分转秒
    unsigned int  timeS;                     //秒
    unsigned char i;
    unsigned char timeMD;                    //月份
    unsigned int timeYD;                     //年份-2021的差
    unsigned long timesp;                    //返回时间戳
        
    for(i=0; i<14; i++)                                                                                        //字符转为数值,并逐个相减,其实主要用到前四位的年份,后面转不转无所谓,不过这样写程序简单
    {
        nowtime=*ntime++;
        nowtime=nowtime-48;
        timeb=timeb-48;
        timedv=nowtime-timeb;
    }
    timeYD=nowtime[0]*1000+nowtime[1]*100+nowtime[2]*10+nowtime[3]-(timeb[0]*1000+timeb[1]*100+timeb[2]*10+timeb[3]);
    timeY=timeYD*31536000+(timeYD/4)*86400+1609430400;//计算年份时间戳,直接写 天数*24*3600 结果就会偏差很大,写天数*86400就正确,原因未知
    timeMD=timedv[4]*10+timedv[5];
    switch(timeMD)              //月份时间戳,以下都是直接算好的数值,因为写24*3600*天数就会偏差很大,所以直接写的数值,同时也减轻单片机工作量
                                                  //话说8位单片机计算能力确实差,还是交给人工队提前算好吧。
    {
    case 0:{timeM=0;}
    case 1:{timeM=2678400;break;}
    case 2:{timeM=5097600;break;}
    case 3:{timeM=7776000;break;}
    case 4:{timeM=10368000;break;}
    case 5:{timeM=13046400;break;}
    case 6:{timeM=15638400;break;}
    case 7:{timeM=18316800;break;}
    case 8:{timeM=20995200;break;}
    case 9:{timeM=23587200;break;}
    case 10:{timeM=26265600;break;}
    case 11: {timeM=28857600;break;}
    default:break;
                }
    if((timeYD+1)%4 == 0 & timeMD > 1)
    {
        timeM=timeM+86400;
    }
    timeD=(timedv[6]*10+timedv[7])*86400;
    timeH=(timedv[8]*10+timedv[9])*3600;
    timeMIN=(timedv[10]*10+timedv[11])*60;
    timeS=timedv[12]*10+timedv[13];
    timesp = timeY+timeM+timeD+timeH+timeMIN+timeS;
    return timesp;
}


时间转时间戳.rar

1.21 KB, 下载次数: 0, 下载积分: 家元 -55

打赏

参与人数 1家元 +60 收起 理由
家睦 + 60

查看全部打赏

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-14 21:51 , Processed in 0.249600 second(s), 16 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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