// The gmtime() function converts the calendar time timep to broken-down // time representation, expressed in Coordinated Universal Time (UTC). const struct tm* gmtime(time_t time){ static struct tm tm; uint32_t dayclock = time % SECS_DAY; tm.tm_mday = time / SECS_DAY; tm.tm_year = EPOCH_YR; tm.tm_sec = time % 60UL; tm.tm_min = (time % 3600UL) / 60; tm.tm_hour = dayclock / 3600UL; tm.tm_wday = (tm.tm_mday + 4) % 7; /* day 0 was a thursday */ while (tm.tm_mday >= YEARSIZE(tm.tm_year)) { tm.tm_mday -= YEARSIZE(tm.tm_year); tm.tm_year++; } tm.tm_mon = 0; while (tm.tm_mday >= monthlen(LEAPYEAR(tm.tm_year),tm.tm_mon)) { tm.tm_mday -= monthlen(LEAPYEAR(tm.tm_year),tm.tm_mon); tm.tm_mon++; } tm.tm_mday++; return &tm; }
// gmtime -- convert calendar time (sec since 1970) into broken down time // returns something like Fri 2007-10-19 in day and 01:02:21 in clock // The return values is the minutes as integer. This way you can update // the entire display when the minutes have changed and otherwise just // write current time (clock). That way an LCD display needs complete // re-write only every minute. uint8_t gmtime(const uint32_t time,char *day, char *clock) { char dstr[4]; uint8_t i; uint32_t dayclock; uint16_t dayno; uint16_t tm_year = EPOCH_YR; uint8_t tm_sec,tm_min,tm_hour,tm_wday,tm_mon; dayclock = (time) % SECS_DAY; dayno = (time) / SECS_DAY; extern newMinute; tm_sec = dayclock % 60UL; newMinute=tm_sec; tm_min = (dayclock % 3600UL) / 60; tm_hour = dayclock / 3600UL; tm_wday = (dayno + 4) % 7; /* day 0 was a Thursday */ while (dayno >= YEARSIZE(tm_year)) { dayno -= YEARSIZE(tm_year); tm_year++; } tm_mon = 0; while (dayno >= monthlen(LEAPYEAR(tm_year),tm_mon)) { dayno -= monthlen(LEAPYEAR(tm_year),tm_mon); tm_mon++; } i=0; while (i<3){ dstr[i]= pgm_read_byte(&(day_abbrev[tm_wday*3 + i])); i++; } dstr[3]='\0'; sprintf_P(day,PSTR("%s %u-%02u-%02u"),dstr,tm_year,tm_mon+1,dayno + 1); sprintf_P(clock,PSTR("%02u:%02u:%02u"),tm_hour,tm_min,tm_sec); return(tm_min); }