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日开始到你看到这片笔记时经过的秒数)
在线工具:进行时间戳与北京时间的转换
Unix 时间戳(stm32实现解析与转换)
2.为什么使用Unix时间戳
因为我上位机的程序协议用到了,便于检测设备的反应速度。(就是工作需要。。。。。)

3.如何在单片机中实现Unix时间戳
平台:STM32F103ZET6(ST 的实现方法都差不多)
语言:C语言 (使用 ST hal库 采用stm32cubemx 产生相关工程)

实现内容:
单片机接收到Unix时间戳解析为本地时间,并设置RTC。
RTC读出来本地时间转换为Unix时间戳发送出去

数据:
Unix 时间戳(stm32实现解析与转换)

Unix 时间戳(stm32实现解析与转换)
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);
		    
		
		stmT.tm_year=sdate.Year+100;
		stmT.tm_mon=sdate.Month-1;  
		stmT.tm_mday=sdate.Date;  
		stmT.tm_hour=stime.Hours-8;  
		stmT.tm_min=stime.Minutes;  
		stmT.tm_sec=stime.Seconds;  
		        
		 sprintf(buf,"%u",mktime(&stmT));
		 printf("UTC:%s \r\n",buf);
 }

效果:
解析成功
r是我上位机发送下来的时间戳,UTC是通过本地时间转换的时间戳
Unix 时间戳(stm32实现解析与转换)