示例#1
0
// 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);
}