如何在4个字节内保存日期时间戳

时间:2014-08-06 05:54:12

标签: c embedded


我想将嵌入式系统的开始时间和日期记录到内存中。 在这里,我想知道有任何标准可以将日期时间戳保存在4个字节内 该系统在arm7上使用免费的rtos。该板包含RTC
感谢。

2 个答案:

答案 0 :(得分:1)

下面的结构显示了在4个字节(或32位)内存储时间和日期的三种方法。

#pragma pack(1)
typedef struct TIMESTAMP_32_A_S
   {
   uint8_t   seconds    : 6; // 0-60 (0-63 max)
   uint8_t   minutes    : 6; // 0-60 (0-63 max)
   uint8_t   hours24    : 5; // 0-23 (0-31 max)
   uint8_t   dayOfMonth : 5; // 1-31 (0-31 max)
   uint8_t   month      : 4; // 1-12 (0-15 max)
   uint8_t   year       : 6; // Epoch start: 2014, Range: 2014 thru 2077
   } TIMESTAMP_32_A_T;                                                  
#pragma pack()

上述结构假设seconds的粒度对应用程序很重要。它还假定应用程序不会在year 2014之前执行,也不会在year 2077之后执行(此时year将回滚到2014年)。

#pragma pack(1)
typedef struct TIMESTAMP_32_B_S
   {
   uint8_t   minutes    : 6; // 0-60 (0-63 max)
   uint8_t   hours24    : 5; // 0-23 (0-31 max)
   uint8_t   dayOfMonth : 5; // 1-31 (0-31 max)
   uint8_t   month      : 4; // 1-12 (0-15 max)
   uint16_t  year       : 12; // Epoch start: 2014, Range: 2014 thru 4061
   } TIMESTAMP_32_B_T;
#pragma pack()

上述结构假定seconds与应用程序无关。它还假定应用程序不会在year 2014之前执行,也不会在year 4061之后执行(此时year将回滚到2014年)。

#pragma pack(1)
typedef struct TIMESTAMP_32_C_S
   {
   uint8_t   secondsBy2 : 5; // 0-30 (0-31 max)
   uint8_t   minutes    : 6; // 0-60 (0-63 max)
   uint8_t   hours24    : 5; // 0-23 (0-31 max)
   uint8_t   dayOfMonth : 5; // 1-31 (0-31 max)
   uint8_t   month      : 4; // 1-12 (0-15 max)
   uint8_t   year       : 7; // Epoch start: 2014, Range: 2014 thru 2141
   } TIMESTAMP_32_C_T;
#pragma pack()

上述结构假设{2}间隔的seconds粒度足以满足应用程序的要求。它还假定应用程序不会在year 2014之前执行,也不会在year 2141之后执行(此时year将回滚到2014年)。 MSDOS使用了类似的结构。

答案 1 :(得分:0)

您可以测量自特定时间以来的秒数,例如here

例如,从1970年开始测量秒数将提供到2038年的范围。

如果您测量自2021年以来的秒数,它将为您提供2089的范围。