8位单片机可用的 mktime localtime函数
8位单片机可用的 mktime localtime函数及源码
最近在做一个8位单片机项目,其中用到了时间戳转换函数,这个在32位机上一个库函数就解决了问题,没想到在8位单片机中没有对应库(time.h),没有办法只有自己来写。
目标:1,满足和库函数mktime localtime所计算出的数据一至;2,考虑8位单片机的处理能力慢软件效率问题。
分享给大家,方便有同样需求的朋友。
gcc 环境进行测试:
测试程序:
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <string.h> #if 0
struct tm {
int tm_sec; /* seconds after the minute, 0 to 60
(0 - 60 allows for the occasional leap second) */
int tm_min; /* minutes after the hour, 0 to 59 */
int tm_hour; /* hours since midnight, 0 to 23 */
int tm_mday; /* day of the month, 1 to 31 */
int tm_mon; /* months since January, 0 to 11 */
int tm_year; /* years since 1900 */
// int tm_wday; /* days since Sunday, 0 to 6 */
// int tm_yday; /* days since January 1, 0 to 365 */
// int tm_isdst; /* Daylight Savings Time flag */
};
#endif
static const char mon_list[] = {, , , , , , , , , , , };
static const char leap_mon_list[] = {, , , , , , , , , , , }; /*******************************************************************************
* Function Name : fun_mktime
* Description : 时间转为时间戳
* Input :
* Output :
* Other :
* Date : 2016.11.14
*******************************************************************************/
int32_t fun_mktime(struct tm *pT)
{
const char *pDays = NULL;
int32_t tmp = ;
int16_t i = ; //计算总共有多少个闰年
tmp = (pT->tm_year / - pT->tm_year / + pT->tm_year / ) - ( / - / + / ); //如果当年是闰年,需要减去当年的闰年
if ((pT->tm_year % == ) && ((pT->tm_year % != ) || (pT->tm_year % == )))
{
tmp = tmp - + (pT->tm_year - ) * ;
pDays = leap_mon_list;
}
else
{
tmp = tmp + (pT->tm_year - ) * ;
pDays = mon_list;
} for (i = ; i < pT->tm_mon - ; i++)
tmp += pDays[i]; tmp = tmp + pT->tm_mday - ; tmp = tmp * + pT->tm_hour; tmp = tmp * + pT->tm_min; tmp = tmp * + pT->tm_sec; return tmp;
} /*******************************************************************************
* Function Name : fun_localtime
* Description : 时间戳转为时间
* Input : struct tm *pT: 输出的时间缓冲区 uint32_t tim:当前时间戳
* Output :
* Other :
* Date : 2016.11.14
*******************************************************************************/
void fun_localtime(struct tm *pT, int32_t tim)
{
const char *pDays = NULL; uint16_t index = ; memset(pT, , sizeof(*pT)); //year initialization
if (tim > 0x5685C180L) // 2016-1-1 0:0:0
{
pT->tm_year = ;
tim -= 0x5685C180L;
}
else if (tim > 0x4B3D3B00L) // 2010-1-1 0:0:0
{
pT->tm_year = ;
tim -= 0x4B3D3B00L;
}
else if (tim > 0x386D4380L) // 2000-1-1 0:0:0
{
pT->tm_year = ;
tim -= 0x386D4380L;
}
else
{
pT->tm_year = ;
} //now have year
while (tim >= 366L * * * )
{
if ((pT->tm_year % == ) && ((pT->tm_year % != ) || (pT->tm_year % == )))
tim -= 366L * * * ;
else
tim -= 365L * * * ; pT->tm_year++;
} // then 365 * 24 * 60 * 60 < tim < 366 * 24 * 60 * 60
if (!(((pT->tm_year % == ) && ((pT->tm_year % != ) || (pT->tm_year % == ))))
&& (tim > 365L * * * ))
{
tim -= 365L * * * ;
pT->tm_year++;
} // this year is a leap year?
if (((pT->tm_year % == ) && ((pT->tm_year % != ) || (pT->tm_year % == ))))
pDays = leap_mon_list;
else
pDays = mon_list; pT->tm_mon = ;
// now have mon
while (tim > pDays[index] * 24L * * )
{
tim -= pDays[index] * 24L * * ;
index++;
pT->tm_mon++;
} // now have days
pT->tm_mday = tim / (24L * * ) + ;
tim = tim % (24L * * ); // now have hour
pT->tm_hour = tim / ( * );
tim = tim % ( * ); // now have min
pT->tm_min = tim / ;
tim = tim % ; pT->tm_sec = tim;
} int main (void *parg)
{
struct tm *pT = {};
time_t timep = ;
uint32_t cur_tim = ; time(&timep); pT = localtime(&timep); printf("linux time \t= %d\n", (int32_t)timep);
pT->tm_year += ;
pT->tm_mon += ;
printf("fun_mktime \t= %d\n", cur_tim = (uint32_t)fun_mktime(pT)); printf("localtime \t= %d-%d-%d %d:%d:%d\n", pT->tm_year, pT->tm_mon, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec);
memset(pT, , sizeof(*pT));
fun_localtime(pT, cur_tim);
printf("fun_localtime \t= %d-%d-%d %d:%d:%d\n", pT->tm_year, pT->tm_mon, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec);
return ;
}
测试结果:
linux time =
fun_mktime =
localtime = -- ::
fun_localtime = -- ::
linux time 是库函数mktime计算结果,因为进行了时区处理,所以与fun_mktime计算出来刚好是8 * 3600 秒的差值
此函数在C51下进行过测试,符合要求。
8位单片机可用的 mktime localtime函数的更多相关文章
- freescale 16位单片机的地址映射
以MC9S12XS128MAL为例,其实DG128之类的类似.如图一,128代表的是单片机中的FLASH大小为128K Byte,同理64代表的是单片机中的FLASH大小为64 K Byte,256代 ...
- 为 32 位单片机设计的脚本语言 Berry
Berry是一款一款为32位单片机设计的脚本语言.Berry解释器使用C89标准实现,该语言可以在RAM或ROM很小的设备上运行. 尽管Berry的体积很小,但是它也支持class以及闭包等功能,使得 ...
- 8位、16位、32位单片机中的“XX位”指什么?
32位单片机的32位是指单片机的“字长”,也就是一次运算中参与运算的数据长度,这个位是指二进制位. 如果总线宽度与CPU一次处理的数据宽度相同,则这个宽度就是所说的单片机位数. 如果总线宽度与CPU一 ...
- localtime函数和strftime函数
localtime函数 功能: 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间,而gmtime函数转换后的时间没有经过时区变换,是UTC时间 . 用法: #include & ...
- Linux C 中获取local日期和时间 time()&localtime()函数
1. time() 函数 /* time - 获取计算机系统当前的日历时间(Calender Time) * 处理日期时间的函数都是以本函数的返回值为基础进行运算 * * 函数原型: * #incl ...
- PHP localtime() 函数
------------恢复内容开始------------ 实例 以一个数值数组和一个关联数组的形式输出本地时间: <?phpprint_r(localtime());echo "& ...
- C语言的setlocale和localtime函数(C++也可用)
Example 1234567891011121314151617181920212223242526272829303132 /* setlocale example */ #include < ...
- C获取本地时间的localtime函数
最近有朋友问如下问题: #include <stdio.h>#include <stdlib.h>#include <iconv.h>#include <ti ...
- php strtotime,mktime,DateTime函数处理时间累加问题
时间戳(年月日时分秒) 使用strtotime函数,结合+1 month,-1 month,next month,last month的时候会出现一些问题. demo示例: //时间"20 ...
随机推荐
- Swoole系列(三):建立TCP服务器并发送数据测试
<?php // 建立tcp服务器下 $host = '0.0.0.0'; $port = 9501; $serv = new swoole_server($host,$port); $serv ...
- mediawiki常用设置
修改mediawiki的logo图标 在LocalSettings.php文件中添加或修改以下代码: //$wgLogo = "$wgStylePath/common ...
- valgrind调查内存leak
快有几个月没更新了,记录一下最近解决问题用到的工具吧. 最近代码跑压力测试,总是发现内存在无规律的慢慢增加,因此在Android上用上了大名顶顶的valgrind,说实话,真是名不虚传, 真是建议以后 ...
- Starting Tomcat v7.0 Server at localhost' has encountered a problem. 如何解决
刚刚学习JavaWeb,遇到了一个问题 因为是初学,我在工程中编写了一个JSP,想要在浏览器中打开,然后出现了这个问题: 在途中大家可以看到,我点击运行写好的JSP,却出现错误,真正的原因是因为Jav ...
- 回调函数(callback)是什么?
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给 ...
- SSH框架解析
当也许能够说是与你的初恋.妙龄的少女開始有些羞涩.是时候说说SHH的故事了.SHH是指Spring+Struts+Hibernate.还记研究生复试那天的面试,老师说了一句话Spring的核心是控制反 ...
- Wireshark使用注意事项
一直在使用老板的Wireshark,因为4G网络的逐步开通,越来越须要新版Wireshark来解析一些数据包. 在更换了新Wireshark的1.11.3后发现原来能够解析Gb口数据的NSIP不见了 ...
- Error:“const char*”类型的实参与“wchar_t”类型的形参不兼容
MainApp\RPolarView.cpp(1571): error C2664: “ATL::CStringT<BaseType,StringTraits>::ReverseFind” ...
- ios -特殊符号大全分享给大家,直接复制粘贴就可以使用了!
░ ▒ ▬ ♦ ◊ ◦ ♠ ♣ ▣ ۰•● ❤ ●•۰ ► ◄ ▧ ▨ ♨ ◐ ◑ ↔ ↕ ▪ ▫ ☼ ♦ ♧♡♂♀♠♣♥❤☜☞☎☏⊙◎ ☺☻☼▧▨♨◐◑↔↕▪ ▒ ◊◦▣▤▥ ▦▩◘ ◈◇♬♪♩♭♪ ...
- python静态网页爬虫之xpath(简单的博客更新提醒功能)
直接上代码: #!/usr/bin/env python3 #antuor:Alan #-*- coding: utf-8 -*- import requests from lxml import e ...