#include "Services_UTC.h" #define UTC_BASE_YEAR 1970u #define MONTH_PER_YEAR 12u #define DAY_PER_YEAR 365u #define SEC_PER_DAY 86400u #define SEC_PER_HOUR 3600u #define SEC_PER_MIN 60u const unsigned char g_day_per_mon[MONTH_PER_YEAR] = {31u, 28u, 31u, 30u, 31u, 30u, 31u, 31u, 30u, 31u, 30u, 31u}; /*以下为UTC时间戳转换代码实现逻辑*/ static unsigned char applib_dt_last_day_of_mon(unsigned char month, unsigned short year); static unsigned char applib_dt_is_leap_year(unsigned short year); unsigned long int mytime_2_utc_sec(_MYTIME_STRUCT *currTime) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ unsigned short i; unsigned int no_of_days = 0u; unsigned int utc_time; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ if (currTime->nYear < UTC_BASE_YEAR) { utc_time = 0u; } else { /* year */ for (i = UTC_BASE_YEAR; i < currTime->nYear; i++) { no_of_days += (DAY_PER_YEAR + applib_dt_is_leap_year(i)); } /* month */ for (i = 1u; i < currTime->nMonth; i++) { no_of_days += applib_dt_last_day_of_mon((unsigned char) i, currTime->nYear); } /* day */ no_of_days += (currTime->nDay - 1u); /* sec */ utc_time = (unsigned int) no_of_days * SEC_PER_DAY + (unsigned int)currTime->nHour * SEC_PER_HOUR + (unsigned int)currTime->nMin * SEC_PER_MIN + (unsigned int)currTime->nSec; } return utc_time; } static unsigned char applib_dt_last_day_of_mon(unsigned char month, unsigned short year) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ unsigned char m8 = 0u; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ if ((month == 0u) || (month > 12u)) { m8 = g_day_per_mon[1u] + applib_dt_is_leap_year(year); } if (month != 2u) { m8 = g_day_per_mon[month - 1u]; } else { m8 = g_day_per_mon[1u] + applib_dt_is_leap_year(year); } return m8; } static unsigned char applib_dt_is_leap_year(unsigned short year) { /*----------------------------------------------------------------*/ /* Local Variables */ /*----------------------------------------------------------------*/ unsigned char m8 = 0u; /*----------------------------------------------------------------*/ /* Code Body */ /*----------------------------------------------------------------*/ if ((year % 400u) == 0u) { m8 = 1u; /*return 1u;*/ } else if ((year % 100u) == 0u) { m8 = 0u; /*return 0u;*/ } else if ((year % 4u) == 0u) { m8 = 1u; /*return 1u;*/ } else { m8 = 0u; /*return 0u;*/ } return m8; } unsigned short Read_Version_UTC(void) { return 0x0001u; }