nrf51822 ---时间换成时间戳

来源:互联网 发布:数据误删恢复软件 编辑:程序博客网 时间:2024/06/06 18:08



单片机中时期如何转换成时间戳
 Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中(比如Linux系统),也在许多其他操作系统中被广泛采用。
 转换程序如下:

//**************************************************************************/******************************************************************************** * @file     calender.h * @author   Depth    * @version  V1.0.0 * @brief    head file for calender.c ******************************************************************************/#ifndef CALENER_H#define CALENER_H#ifdef __cplusplusextern "C"{#endif#include <stdint.h> /********************************************************************* * MACROS */ #define IsLeapYear(yr) (!((yr) % 400) || (((yr) % 100) && !((yr) % 4)))/********************************************************************* * TYPEDEFS */ // To be used withtypedef struct{  uint8_t seconds;  // 0-59  uint8_t minutes;  // 0-59  uint8_t hour;     // 0-23  uint8_t day;      // 0-30  uint8_t month;    // 0-11  uint16_t year;    // 2000+} UTCTimeStruct;// number of seconds since 0 hrs, 0 minutes, 0 seconds, on the// 1st of January 2000 UTCtypedef uint32_t UTCTime;extern UTCTime TimeSeconds;extern UTCTimeStruct Time_iOS; /********************************************************************* * FUNCTIONS */  /*   * Updates the OSAL clock and Timers from the MAC 320us timer tick.   */  extern void TimeUpdate( void );  /*   * Set the new time.  This will only set the seconds portion   * of time and doesn't change the factional second counter.   *     newTime - number of seconds since 0 hrs, 0 minutes,   *               0 seconds, on the 1st of January 2000 UTC   */  extern void Set_Clock( UTCTime newTime );  /*   * Gets the current time.  This will only return the seconds   * portion of time and doesn't include the factional second counter.   *     returns: number of seconds since 0 hrs, 0 minutes,   *              0 seconds, on the 1st of January 2000 UTC   */  extern UTCTime Get_Clock( void );  /*   * Converts UTCTime to UTCTimeStruct   *   * secTime - number of seconds since 0 hrs, 0 minutes,   *          0 seconds, on the 1st of January 2000 UTC   * tm - pointer to breakdown struct   */  extern void ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime );  /*   * Converts UTCTimeStruct to UTCTime (seconds since 00:00:00 01/01/2000)   *   * tm - pointer to UTC time struct   */  extern UTCTime ConvertUTCSecs( UTCTimeStruct *tm );  /*   * Update/Adjust the osal clock and timers   * Msec - elapsed time in milli seconds    */  extern void AdjustTimer( uint32_t Msec );/******************************************************************************************************************************************/#ifdef __cplusplus}#endif#endif /* OSAL_CLOCK_H */

/******************************************************************************** * @file     calender.c * @author   Depth    * @version  V1.0.0    * @date     12-May-2014   * @brief    calender module based on app timer******************************************************************************/#include "calender.h"/********************************************************************* * MACROS */#define YearLength(yr) (IsLeapYear(yr) ? 366 : 365)//ÈÕÀú±äÁ¿UTCTimeStruct Time_iOS = {14,13,12,11,1,2015};UTCTimeStruct Time_Current;/********************************************************************* * CONSTANTS */// (MAXCALCTICKS * 5) + (max remainder) must be <= (uint16_t max),// so: (13105 * 5) + 7 <= 65535#define MAXCALCTICKS  ((uint16_t)(13105))#define BEGYEAR         1970     // UTC started at 00:00:00 January 1, 2000#define DAY             86400UL  // 24 hours * 60 minutes * 60 seconds/********************************************************************* * EXTERNAL FUNCTIONS */extern uint16_t ll_McuPrecisionCount(void);/********************************************************************* * LOCAL VARIABLES *///static uint16_t previousLLTimerTick = 0;//static uint16_t remUsTicks = 0;//static uint16_t timeMSec = 0;// number of seconds since   2010.1.1.  00:00:00UTCTime TimeSeconds = 0;/********************************************************************* * LOCAL FUNCTION PROTOTYPES */static uint8_t monthLength( uint8_t lpyr, uint8_t mon );/********************************************************************* * FUNCTIONS *//********************************************************************* * @fn      Set_Clock * * @brief   Set the new time.  This will only set the seconds portion *          of time and doesn't change the factional second counter. * * @param   newTime - number of seconds since 0 hrs, 0 minutes, *                    0 seconds, on the 1st of January 2000 UTC * * @return  none */void Set_Clock( UTCTime newTime ){  TimeSeconds = newTime;}/********************************************************************* * @fn      Get_Clock * * @brief   Gets the current time.  This will only return the seconds *          portion of time and doesn't include the factional second *          counter. * * @param   none * * @return  number of seconds since 0 hrs, 0 minutes, 0 seconds, *          on the 1st of January 2000 UTC */UTCTime Get_Clock( void ){  return ( TimeSeconds );}/********************************************************************* * @fn      ConvertUTCTime * * @brief   Converts UTCTime to UTCTimeStruct * * @param   Êä³ö tm - pointer to breakdown struct * * @param   ÊäÈë secTime - number of seconds since 0 hrs, 0 minutes, *          0 seconds, on the 1st of January 2000 UTC * * @return  none */void ConvertUTCTime( UTCTimeStruct *tm, UTCTime secTime ){  // calculate the time less than a day - hours, minutes, seconds  {    uint32_t day = secTime % DAY;  // Çó³ö×îºóÒ»ÌìµÄÊ£ÓàÃëÊý£¬£¨³ýÈ¥ÕûÊýµÄÌìÊýÖ®ºóµÄÊ£ÓàÃëÊý£©    tm->seconds = day % 60UL;      // Çó³ö×îºóÒ»·ÖÖÓµÄÊ£ÓàÃëÊý £¨×îºóÒ»ÌìµÄÊ£ÓàÃëÊý¶Ô60ÇóÓࣩ    tm->minutes = (day % 3600UL) / 60UL;  //Çó³ö ×îºóһСʱʣÓàµÄÕû·ÖÖÓÊý    tm->hour = day / 3600UL;       //Çó×îºóÒ»ÌìµÄÕûСʱÊý  }  // Fill in the calendar - day, month, year  {    uint16_t numDays = secTime / DAY;    tm->year = BEGYEAR;    while ( numDays > YearLength( tm->year ) )    {      numDays -= YearLength( tm->year );      tm->year++;    }    tm->month = 0;    while ( numDays > monthLength( IsLeapYear( tm->year ), tm->month ) )    {      numDays -= monthLength( IsLeapYear( tm->year ), tm->month );      tm->month++;    }    tm->month++;    tm->day = numDays;  tm->day++;  //СÍõ  }}/********************************************************************* * @fn      monthLength * * @param   lpyr - 1 for leap year, 0 if not * * @param   mon - 0 - 11 (jan - dec) * * @return  number of days in specified month */static uint8_t monthLength( uint8_t lpyr, uint8_t mon ){  uint8_t days = 31;  if ( mon == 1 ) // feb  {    days = ( 28 + lpyr );  }  else  {    if ( mon > 6 ) // aug-dec    {      mon--;    }    if ( mon & 1 )    {      days = 30;    }  }  return ( days );}/********************************************************************* * @fn      ConvertUTCSecs * * @brief   Converts a UTCTimeStruct to UTCTime * * @param   tm - pointer to provided struct * * @return  number of seconds since 00:00:00 on 01/01/2000 (UTC) */UTCTime ConvertUTCSecs( UTCTimeStruct *tm ){  uint32_t seconds;  /* Seconds for the partial day */  seconds = (((tm->hour * 60UL) + tm->minutes) * 60UL) + tm->seconds;  /* Account for previous complete days */  {    /* Start with complete days in current month */    uint16_t days = tm->day;    /* Next, complete months in current year */    {      int8_t month = tm->month - 1;//      while ( --month >= 0 )      {        days += monthLength( IsLeapYear( tm->year ), month );      }    }    /* Next, complete years before current year */    {      uint16_t year = tm->year;      while ( --year >= BEGYEAR )      {        days += YearLength( year );      }    }    /* Add total seconds before partial day */    seconds += (days * DAY);  }  return ( seconds );}

/******************************************************************************************************************************************************/  void   main(){  UTCTimeStruct   Time = {14,30,16,18,8,2015};  Secondflag  = ConvertUTCSecs(&Time) - 8*3600;  //可以得到多少s,但是因为时间戳是从8:0:0开始计数的 所以应该减去8*3600s  ConvertUTCTime(&Time,1439885936+8*3600);  //为什么要加8*3600 因为是从1970:1:1:8:0:0开始计数的} 



0 0