/* * gmtime — разложить секунды эпохи в struct tm. * * localtime и gmtime делят один статический буфер — при необходимости * пережить следующий вызов клиент копирует результат (поведение POSIX). * Таймзон нет: localtime() просто вызывает gmtime(). */ #include #include "_time.h" static struct tm tm_buf; struct tm *gmtime(time_t *timep) { unsigned long sec = *timep; tm_buf.tm_sec = (unsigned char)(sec % 60); sec /= 60; tm_buf.tm_min = (unsigned char)(sec % 60); sec /= 60; tm_buf.tm_hour = (unsigned char)(sec % 24); sec /= 24; /* sec теперь — дни с 1970-01-01 (четверг). */ tm_buf.tm_wday = (unsigned char)((4 + sec) % 7); /* подобрать год */ unsigned int y = 1970; unsigned long days = sec; while (days >= (unsigned long)(_tm_is_leap(y) ? 366 : 365)) { days -= _tm_is_leap(y) ? 366 : 365; y++; } tm_buf.tm_year = (int)y - 1900; tm_buf.tm_yday = (int)days; /* подобрать месяц/день */ unsigned int m = 0; while (m < 12) { unsigned int dim = _tm_mdays[m] + ((m == 1) && _tm_is_leap(y) ? 1u : 0u); if (days < dim) break; days -= dim; m++; } tm_buf.tm_mon = (unsigned char)m; tm_buf.tm_mday = (unsigned char)(days + 1); tm_buf.tm_isdst = 0; tm_buf.tm_hundredth = 0; return &tm_buf; }