#include<stdio.h> /* date type defination */ typedef signed char rt_int8_t; typedef signed short rt_int16_t; typedef signed long rt_int32_t; typedef unsigned char rt_uint8_t; typedef unsigned short rt_uint16_t; typedef unsigned long rt_uint32_t; typedef int rt_bool_t; typedef rt_int8_t int8_t; typedef rt_uint8_t uint8_t; typedef rt_int16_t int16_t; typedef rt_uint16_t uint16_t; typedef rt_int32_t int32_t; typedef rt_uint32_t uint32_t; typedef struct _rtc { /* date and time components */ uint16_t sec; //senconds after the minute, 0 to 59 uint16_t min; //minutes after the hour, 0 to 59 uint16_t hour; //hours since midnight, 0 to 23 uint16_t mday; //day of the month, 1 to 31 uint16_t month; //months of the year, 1 to 12 uint16_t year; //years, START_YEAR to START_YEAR+135 uint16_t wday; //days since Sunday, 0 to 6 uint16_t yday; //days of the year, 1 to 366 }RTC_T; RTC_T TempTime; uint8_t IsLeap(int16_t nYear); static int16_t Ymd2Wday(int16_t nYear, int16_t nMonth, int16_t nMday); #define START_YEAR (1970) //default 2000, Jan.1, 00:00:00 #define TIMEZONE_8 (8*60*60) #define SEC_IN_DAY (60*60*24)//total seconds in one day #define DAY_IN_YEAR(nYear) (IsLeap(nYear) ? 366 : 365) const uint8_t mDayNoLeap[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; const uint8_t mDayLeap[13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /******************************************************************************* * Function Name : MyMakeTime * Description : Form a 32 bit second counting value from calendar. * Input : pointer to a calendar struct * Return : 32 bit second counting value *******************************************************************************/ static uint32_t MyMakeTime(RTC_T *pCalendar) { uint32_t TotalSeconds = pCalendar->sec; int16_t nYear = pCalendar->year; int16_t nMonth = pCalendar->month; if((nYear < START_YEAR) || (nYear > (START_YEAR + 135))) { return 0; //out of year range } TotalSeconds += (uint32_t)pCalendar->min * 60;//contribution of minutes TotalSeconds += (uint32_t)pCalendar->hour * 3600;//contribution of hours //contribution of mdays TotalSeconds += (uint32_t)(pCalendar->mday - 1) * SEC_IN_DAY; if(IsLeap(nYear)) while(nMonth > 1) { TotalSeconds += (uint32_t)mDayLeap[--nMonth] * SEC_IN_DAY; } else while(nMonth > 1)//contribution of months { TotalSeconds += (uint32_t)mDayNoLeap[--nMonth] * SEC_IN_DAY; } while(nYear > START_YEAR)//contribution of years { TotalSeconds += (uint32_t)DAY_IN_YEAR(--nYear) * SEC_IN_DAY; } return TotalSeconds; } //end function MyMakeTime /******************************************************************************* * Function Name : MyLocalTime * Description : Form a calendar from 32 bit second counting. * Input : pointer to a 32 bit second value, option pointer to a struct * Return : Calendar structure *******************************************************************************/ static RTC_T MyLocalTime(uint32_t TotalSecs, RTC_T *pCalendar) { RTC_T Calendar;//Local variables uint32_t TotalDays, Remainder; Calendar.year = START_YEAR;//Calendar initialization Calendar.month = 1; Calendar.mday = 1; Calendar.yday = 1; Calendar.wday = Ymd2Wday(START_YEAR, 1, 1); TotalDays = TotalSecs/SEC_IN_DAY;//Split days from seconds Remainder = TotalSecs%SEC_IN_DAY; Calendar.wday = (TotalDays + Calendar.wday) % 7;//Get week day Calendar.hour = Remainder/3600;//Get clock in day Calendar.min = (Remainder/60)%60; Calendar.sec = Remainder%60; while(TotalDays >= DAY_IN_YEAR(Calendar.year)) { TotalDays -= DAY_IN_YEAR(Calendar.year++); } Calendar.yday += TotalDays;//Get years and days in year if(IsLeap(Calendar.year))//Get months and days in month while(TotalDays >= mDayLeap[Calendar.month]) { TotalDays -= mDayLeap[Calendar.month++]; } else while(TotalDays >= mDayNoLeap[Calendar.month]) { TotalDays -= mDayNoLeap[Calendar.month++]; } Calendar.mday += TotalDays; if(pCalendar)//Copy Calendar if necessary { *pCalendar = Calendar; } return Calendar; } //end function MyLocalTime /******************************************************************************* * Function Name : Ymd2Wday * Description : Calculate days in week from year, month, mday. * Input : year, month, mday * Return : 0--6, Suanday--Saturday *******************************************************************************/ static int16_t Ymd2Wday(int16_t nYear, int16_t nMonth, int16_t nMday) { uint8_t i ; if(IsLeap(nYear)) for(i = 1; i < nMonth; i++) { nMday += mDayLeap[i]; } else for(i = 1; i < nMonth; i++) { nMday += mDayNoLeap[i]; } nYear--; return (nYear + nYear/4 - nYear/100 + nYear/400 + nMday)%7; } //end function Ymd2Wday /*********************************************************************** * Function Name : IsLeap * Description : Check whether the past year is leap or not. * Input : 4 digits year number * Return : 1: leap year. 0: not leap year ***********************************************************************/ uint8_t IsLeap(int16_t nYear) { if(nYear % 4 != 0) { return 0; } if(nYear % 100 != 0) { return 1; } return (uint8_t)(nYear % 400 == 0); } void main(void) { uint32_t time; TempTime.sec = 0; TempTime.min = 0; TempTime.hour = 0; TempTime.mday = 3; TempTime.month = 5; TempTime.year =2016; time = MyMakeTime(&TempTime); printf("%d",time); while(1); }