一下程序实现从1970/1/1 0:0:0开始的秒数到对应日期的变化
比如秒数为1,对应日期1970/1/1 0:0:1
源文件:
#include "rtc.h" #define SEC_PER_DAY 86400 #define SEC_PER_HOUR 3600 #define DAY_PER_4YEAR 1461 static const int __day_in_leapyear[13] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; static const int __day_in_commonyear[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; static const int __day_in_4year[5] = { 0, 365, 730, 1096, 1461}; static const time __timebase = { 1970, 1, 1, 0, 0, 0, 0 }; static int __memcpy(void *dst0, const void *src0, int n) { char *src, *dst; src = (char *) src0; dst = (char *) dst0; while(n--) { *dst++ = *src++; } return 0; } int SecToTime(long n_Sec, time * p_Time) { long t; int i; const int * day_in_year; if( n_Sec < 0 ) return 0; __memcpy( p_Time, &__timebase, sizeof(time)); t = n_Sec % SEC_PER_DAY; p_Time->hour = t / SEC_PER_HOUR; t %= SEC_PER_HOUR; p_Time->minute = t / 60; p_Time->second = t % 60; t = n_Sec / SEC_PER_DAY; p_Time->year += 4 * (t/DAY_PER_4YEAR); t %= DAY_PER_4YEAR; for(i=0;i<4;i++) { if(t >= __day_in_4year[i] && t < __day_in_4year[i+1]) break; } p_Time->year += i; if(i == 2) day_in_year = __day_in_leapyear; else day_in_year = __day_in_commonyear; t -= __day_in_4year[i]; for(i=0;i<12;i++) { if(t >= day_in_year[i] && t < day_in_year[i+1]) break; } p_Time->month += i; t -= day_in_year[i]; p_Time->day += t; return 1; } int TimeToSec(time * p_Time) { long res; long t; const int *day_in_year; if( p_Time->year % 4 == 0 ) day_in_year = __day_in_leapyear; else day_in_year = __day_in_commonyear; res = 0; res += day_in_year[ p_Time->month - __timebase.month] * SEC_PER_DAY; res += ( p_Time->day - __timebase.day ) * SEC_PER_DAY; res += ( p_Time->hour - __timebase.hour ) * SEC_PER_HOUR; res += ( p_Time->minute - __timebase.minute ) * 60; res += ( p_Time->second - __timebase.second ); t = p_Time->year - __timebase.year; res += t/4 * __day_in_4year[4] * SEC_PER_DAY; t %= 4; res += __day_in_4year[t] * SEC_PER_DAY; return res; }
头文件:
/** * this file implement the convertion of seconds and date/time */ #ifndef __RTC_H__ #define __RTC_H__ #include <memory.h> typedef struct time { int year; int month; int day; int hour; int minute; int second; int milisecond; } time ; extern int SecToTime(long n_Sec, time * p_Time); extern int TimeToSec(time * p_Time);#endif /*__RTC_H__*/