|
本帖最后由 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;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|