Index: firmware/include/timefuncs.h =================================================================== --- firmware/include/timefuncs.h (revision 14825) +++ firmware/include/timefuncs.h (working copy) @@ -29,6 +29,7 @@ bool valid_time(const struct tm *tm); #if CONFIG_RTC time_t mktime(struct tm *t); +struct tm* localtime(const time_t *timer); #endif #endif /* _TIMEFUNCS_H_ */ Index: firmware/common/timefuncs.c =================================================================== --- firmware/common/timefuncs.c (revision 14825) +++ firmware/common/timefuncs.c (working copy) @@ -166,4 +166,76 @@ result += t->tm_sec; return(result); } +struct tm* localtime(const time_t *timer) +{ + time_t work; + int i, days = 0, years = 70; + static int m_to_d[12] = + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + work = *timer; + tm.tm_sec = work % 60; + work /= 60; /*now have the number of minutes since epoch*/ + tm.tm_min = work % 60; + work /= 60;/*now have the number of hours since epoch*/ + tm.tm_hour = work % 24; + work /= 24;/*now have the number of days since epoch*/ + + for (i = 1970; days <= work; i++) + { + if (i % 4 != 0) /*not a leap year*/ + { + days += 365; + if(days >= work) + { + days -= 365; + break; + } + } + else if (i % 400 == 0) /* leap year*/ + { + days += 366; + if(days >= work) + { + days -= 366; + break; + } + } + else if (i % 100 == 0) /* not a leap year*/ + { + days += 365; + if(days >= work) + { + days -= 365; + break; + } + } + else /* leap year*/ + { + days += 366; + if(days >= work) + { + days -= 366; + break; + } + } + years += 1; + } + days = work - days; + tm.tm_yday = days; + tm.tm_year = years; + for(i=0; i<12; i++) + { + if (m_to_d[i] > days) + { + i--; + break; + } + } + tm.tm_mon = i; + tm.tm_mday = days - m_to_d[i] + 1; + tm.tm_wday = (days % 7 + 4) % 7; + return &tm; +} + + #endif