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

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

[复制链接]
wofei1314 发布时间:2017-3-23 10:28
最近因工作需要把单片机的YYMMDDHHMMSS转为Unix的时间戳,网上大多都是上位机的程序,经过搜索引擎的帮助下,终于实现了把单片机的时间转为Unix的时间戳,特贴出代码给社区内需要的朋友,转载请注明出处!!!: Y" o: S9 Q1 i/ `

9 s5 ^6 _( @- z& z$ M$ I1 M" M由于使用了 struct tm 结构体好是mktime,所以需要包含 <time.h>头文件,把下面的年月日时分秒换成实际的年月日时分秒即可!  f% u: }# W* @. g
废话不多说,核心代码:7 d  \; _, \/ v# W
  1. int32_t GetTick(void)  , a! A9 r# B+ k* B& O. C
  2. {  . f2 Z% \1 \! M  V4 p
  3.     struct tm stm;  1 j; Y$ ?: I6 r' v3 n
  4.     int iY, iM, iD, iH, iMin, iS;  % a7 r) F6 C: J. W4 x9 E8 X" r
  5.        
    + A9 X$ f  S( u* ]! d( i
  6.         RTC_DateTypeDef sdatestructureget;
    ' y9 A3 D: \6 c5 ]0 t. e% L
  7.         RTC_TimeTypeDef stimestructureget;1 [, t1 p) B# I/ u

  8. ( h4 q& u2 ]6 L; P# [& w2 s
  9.         /* Get the RTC current Time */7 q3 S/ f2 s  z5 D6 x+ k& s
  10.         HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);1 ~; y8 J. o# J  O6 q
  11.         /* Get the RTC current Date */4 E: V, j4 t5 F' M+ T2 Z% C% g  \
  12.         HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);3 E  }1 A3 t. D4 R
  13.   
    * T2 X) g4 ?) T7 Y2 ^; @
  14.     memset(&stm,0,sizeof(stm));  + Q5 r* X7 d3 Y- Z

  15. , {2 x( A) {% u' ?0 V2 w
  16.        
    , r" R- U2 R3 @5 T) {: ^
  17.         iY = sdatestructureget.Year;  / `( w( d8 s. @; ^2 m/ y  i# A: O: [
  18.     iM = sdatestructureget.Month;    \9 v4 G2 k7 T* ~2 l# D: o7 h/ V
  19.     iD = sdatestructureget.Date;  
    5 q8 F2 m5 t' J3 q
  20.     iH = stimestructureget.Hours-8;//北京时间-8=UTC  
    4 S4 }: @3 J% j; }+ a
  21.     iMin = stimestructureget.Minutes;  % Q2 D* P! o& C& X9 o
  22.     iS = stimestructureget.Seconds;
    1 A: E2 |/ @) |- i
  23. 9 g% I6 f! ]" {4 p8 n  ]. r
  24.   - n$ f6 P! u) U
  25.     stm.tm_year=iY+100;$ F: H6 M! F& S- o- O% e
  26.     stm.tm_mon=iM-1;  8 }" s4 o/ B1 v# G& R
  27.     stm.tm_mday=iD;  ! m# l! o7 ^( F+ w. Z& S
  28.     stm.tm_hour=iH;  
    4 S4 i+ O! S. Z- C, E% x/ E
  29.     stm.tm_min=iMin;  : F2 D' ]% ]' N' ^* j
  30.     stm.tm_sec=iS;  ' q: C, h* t7 k1 B' q
  31. # _- _& r$ X6 n" z5 s' G
  32.     return mktime(&stm);  . f8 H5 |4 p6 }, v" `3 _8 [! _; e2 D
  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:44
9 S9 p" ^9 y. b  @2 ~/ O你这个应该有问题吧    首先年份上应该减去1900   月份上减一

5 t1 p& F  C7 V! @' q. S( L" {实测没毛病,这是HAL库,不懂别乱说
any012 回答时间:2018-12-4 16:12:25
正好用到,感谢。( l" x: t9 ?  {# w2 q  L4 W
要是把时间戳转本地时间的函数也写出来就更好了。5 M8 {1 U/ K: q3 ^2 b  f: [. u
熊猫仙 回答时间: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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版