你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

单片机RTC时间转为Unix时间戳

[复制链接]
wofei1314 发布时间:2017-3-23 10:28
最近因工作需要把单片机的YYMMDDHHMMSS转为Unix的时间戳,网上大多都是上位机的程序,经过搜索引擎的帮助下,终于实现了把单片机的时间转为Unix的时间戳,特贴出代码给社区内需要的朋友,转载请注明出处!!!
- M' Y& M  T5 c9 a1 H" k( V6 L$ C- s" U& H
由于使用了 struct tm 结构体好是mktime,所以需要包含 <time.h>头文件,把下面的年月日时分秒换成实际的年月日时分秒即可!
# _; B8 L$ o# z" o+ E1 [: E; I废话不多说,核心代码:' g3 e; ?  i6 S: O% O9 C, W2 I
  1. int32_t GetTick(void)  
    7 Z+ K% j, m5 o2 o& P( Z
  2. {  5 O' d' A9 @2 L; G, P* |( d
  3.     struct tm stm;  
    / _9 |  t1 t( Z1 o: f& x7 d0 i
  4.     int iY, iM, iD, iH, iMin, iS;  - u' O# _0 t- v$ z
  5.         # O' N, w6 U8 U3 ^
  6.         RTC_DateTypeDef sdatestructureget;
    : d. \' ^6 j+ l# J
  7.         RTC_TimeTypeDef stimestructureget;# @% l9 S9 Z$ }$ g  P* x

  8. 3 a0 O' K; L/ R; K
  9.         /* Get the RTC current Time */, g6 {: Q, I, T
  10.         HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
    7 @- W! K3 H# M- S+ M, g
  11.         /* Get the RTC current Date */
    " W# q5 ^& m3 Y' @; ~" V1 i7 v
  12.         HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);9 ?2 T/ |- N2 G5 U, w2 U1 |& z
  13.   
    5 z4 p0 n, \$ Y  y* M- ]
  14.     memset(&stm,0,sizeof(stm));  4 M& @- M" f5 v
  15. ) t) E4 W3 `5 l4 z
  16.        
    * ^. E4 z8 a% |" U( F
  17.         iY = sdatestructureget.Year;  7 `% ~. K, p( j* Y$ ~
  18.     iM = sdatestructureget.Month;  
    0 v( d3 E0 Y# k) f  c( W
  19.     iD = sdatestructureget.Date;  
    6 p0 l6 h) s/ a  k' P5 d2 X/ I
  20.     iH = stimestructureget.Hours-8;//北京时间-8=UTC  
    5 m' W( H3 y% O5 |7 ?% W1 G
  21.     iMin = stimestructureget.Minutes;  7 z/ p" K! }1 r- F* K0 a
  22.     iS = stimestructureget.Seconds;
    & F# j9 I" L7 @' y) @# _' r

  23. % w) K" H  ]9 d4 O& v
  24.   ( n$ ?) \6 J' _
  25.     stm.tm_year=iY+100;% d, z: R' k) g9 {2 A6 W
  26.     stm.tm_mon=iM-1;  
    + C: q7 R8 e0 x" Y' y
  27.     stm.tm_mday=iD;  
    5 y3 ^' P9 {8 v2 S8 j# w, X
  28.     stm.tm_hour=iH;  + L" d5 I" f6 O. s1 W9 b  T7 b
  29.     stm.tm_min=iMin;  
    ; l$ Q  y" \2 s1 H
  30.     stm.tm_sec=iS;  + k+ z7 y. c6 n$ i3 D

  31. / [& ?) {# S7 B. u9 m5 u* A- o: n
  32.     return mktime(&stm);  4 ^; q; P6 e9 a+ `4 L: t  S
  33. }
复制代码
收藏 1 评论9 发布时间:2017-3-23 10:28

举报

9个回答
请叫我小张张 回答时间:2017-3-23 10:32:35
点赞
斜阳 回答时间:2017-3-23 10:34:30
赞                              
JeffJiang 回答时间:2017-3-23 10:35:21
赞赞赞
wofei1314 回答时间:2017-3-23 10:43:33
多谢各位捧场~
我姓罗 回答时间:2018-6-12 15:44:18
你这个应该有问题吧    首先年份上应该减去1900   月份上减一     
So_cracy 回答时间:2018-6-28 16:09:07
我姓罗 发表于 2018-6-12 15:444 s7 t5 p. c/ C# h( f' t* U
你这个应该有问题吧    首先年份上应该减去1900   月份上减一
8 {2 D( T# _0 X( N6 V
实测没毛病,这是HAL库,不懂别乱说
any012 回答时间:2018-12-4 16:12:25
正好用到,感谢。
6 W% i* _1 B8 f; Y) H0 I要是把时间戳转本地时间的函数也写出来就更好了。
8 k0 ?$ }7 s8 W* q! w
熊猫仙 回答时间:2019-7-3 09:24:15
mktime(&stm),这句话很费资源啊
徐家阔少 回答时间:2023-2-23 15:33:04

typedef unsigned int time_t; / date/time in unix secs past 1-Jan-70 /

extern _ARMABI time_t mktime(struct tm /timeptr*/) attribute((nonnull(1)));

//本地时间生成时间戳函数 uint32_t TimeToTimeStamp(void) { struct tm stm; memset(&stm,0,sizeof(stm)); stm.tm_year = TimeData.year - 1900; //RTC_Year rang 0-9999,but tm_year since 1900 stm.tm_mon = TimeData.month - 1; //RTC_Month rang 1-12,but tm_mon rang 0-11 stm.tm_mday = TimeData.day; //RTC_Date rang 1-31 and tm_mday rang 1-31 stm.tm_hour = TimeData.hour - 8; //RTC_Hours rang 0-23 and tm_hour rang 0-23 stm.tm_min = TimeData.minute; //RTC_Minutes rang 0-59 and tm_min rang 0-59 stm.tm_sec = TimeData.second; return mktime(&stm); }

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版