Unix时间戳(stm32实现解析与转换)
1.什么是Unix时间戳
Unix时间戳是从1970年1⽉1⽇(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 [1]
Unix时间戳(英⽂为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1⽉1⽇(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.
⼀个⼩时表⽰为UNIX时间戳格式为:3600秒;
⼀天表⽰为UNIX时间戳为86400秒,闰秒不计算。
在⼤多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038
通俗的讲, 时间戳是⼀份能够表⽰⼀份数据在⼀个特定时间点已经存在的完整的可验证的数据。
(简单来讲:就是从1970年1⽉1⽇开始到你看到这⽚笔记时经过的秒数)
在线⼯具:进⾏时间戳与北京时间的转换
2.为什么使⽤Unix时间戳
因为我上位机的程序协议⽤到了,便于检测设备的反应速度。(就是⼯作需要。。。。。)
3.如何在单⽚机中实现Unix时间戳
unix时间戳转换日期格式平台:STM32F103ZET6(ST 的实现⽅法都差不多)
语⾔:C语⾔ (使⽤ ST hal库 采⽤stm32cubemx 产⽣相关⼯程)
实现内容:
单⽚机接收到Unix时间戳解析为本地时间,并设置RTC。
RTC读出来本地时间转换为Unix时间戳发送出去
数据:
1.单⽚机接收到Unix时间戳解析为本地时间,并设置RTC。
(1)由于上位机发送过来的是16进制。⽽Unix时间戳是⼀个Uint32_t的数据,⾸先要对协议包⾥的16进制数据进⾏转换。将16进制的数据转换为⼀个uint32_t的数据
r = ((*p++) << 24);
r = r|((*p++) << 16);
r = r|((*p++) << 8);
r = r| (*p++);
(2)将Unix时间戳进⾏转换(主要使⽤localtime()函数,该函数在“time.h”⾥)
/**
* Description:Unix时间戳解析并设置本地时间
* Parameter:UnixNum Unix时间戳
* Return: NULL
* Others:
*/
void Unix_To_Time(uint32_t UnixNum)
{
struct tm *stmU;
RTC_DateTypeDef sdate;
RTC_TimeTypeDef stime;
time_t Count;
Count = UnixNum;
stmU = localtime(&Count);
sdate.Year = stmU->tm_year - 100;
sdate.Month = stmU->tm_mon + 1;
sdate.Date = stmU->tm_mday;
stime.Hours = stmU->tm_hour + 8;
stime.Minutes = stmU->tm_min;
stime.Seconds = stmU->tm_sec;
HAL_RTC_SetDate(&hrtc,&sdate,RTC_FORMAT_BIN);
HAL_RTC_SetTime(&hrtc,&stime,RTC_FORMAT_BIN);
printf("%02d/%02d/%02d\r\n",2000 + sdate.Year, sdate.Month, sdate.Date);
printf("%02d:%02d:%02d\r\n",stime.Hours, stime.Minutes, stime.Seconds);
printf("\r\n");
}
2.RTC读出来本地时间转换为Unix时间戳发送出去(主要使⽤)
/*
* Description:本地时间⽣成Unix时间戳
* Parameter:
* Return:
* Others:
*/
void Time_To_Unix()
{
char buf[50];
struct tm stmT;
RTC_DateTypeDef sdate;
RTC_TimeTypeDef stime;
HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
<_year=sdate.Year+100;
<_mon=sdate.Month-1;
<_mday=sdate.Date;
<_hour=stime.Hours-8;
<_min=stime.Minutes;
<_sec=stime.Seconds;
sprintf(buf,"%u",mktime(&stmT));
printf("UTC:%s \r\n",buf);
}
效果:
解析成功
r是我上位机发送下来的时间戳,UTC是通过本地时间转换的时间戳
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论