我想做的是将一个纪元时间(1970年1月1日午夜以来的秒数)转换为“真实”时间(m / d / yh:m:s)
到目前为止,我有以下算法,在我看来有点难看:
void DateTime::splitTicks(time_t time) { seconds = time % 60; time /= 60; minutes = time % 60; time /= 60; hours = time % 24; time /= 24; year = DateTime::reduceDaysToYear(time); month = DateTime::reduceDaysToMonths(time,year); day = int(time); } int DateTime::reduceDaysToYear(time_t &days) { int year; for (year=1970;days>daysInYear(year);year++) { days -= daysInYear(year); } return year; } int DateTime::reduceDaysToMonths(time_t &days,int year) { int month; for (month=0;days>daysInMonth(month,year);month++) days -= daysInMonth(month,year); return month; }
你可以假设成员seconds,minutes,hours,month,day,和year存在。
seconds
minutes
hours
month
day
year
使用for循环来修改原始时间感觉有些不对劲,我想知道是否有一个“更好”的解决方案。
for
请注意daysInMonth函数中的leap年。
如果您希望获得非常高的性能,则可以预先计算该对,以便一步一步达到月+年,然后计算日/小时/分钟/秒。
一个好的解决方案是gmtime源代码中的解决方案:
/* * gmtime - convert the calendar time into broken down time */ /* $Header: gmtime.c,v 1.4 91/04/22 13:20:27 ceriel Exp $ */ #include <time.h> #include <limits.h> #include "loc_time.h" struct tm * gmtime(register const time_t *timer) { static struct tm br_time; register struct tm *timep = &br_time; time_t time = *timer; register unsigned long dayclock, dayno; int year = EPOCH_YR; dayclock = (unsigned long)time % SECS_DAY; dayno = (unsigned long)time / SECS_DAY; timep->tm_sec = dayclock % 60; timep->tm_min = (dayclock % 3600) / 60; timep->tm_hour = dayclock / 3600; timep->tm_wday = (dayno + 4) % 7; /* day 0 was a thursday */ while (dayno >= YEARSIZE(year)) { dayno -= YEARSIZE(year); year++; } timep->tm_year = year - YEAR0; timep->tm_yday = dayno; timep->tm_mon = 0; while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) { dayno -= _ytab[LEAPYEAR(year)][timep->tm_mon]; timep->tm_mon++; } timep->tm_mday = dayno + 1; timep->tm_isdst = 0; return timep; }