将纪元时间转换为“实际”日期/时间
我想做的是将一个纪元时间(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
存在。
使用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;
}
以上是 将纪元时间转换为“实际”日期/时间 的全部内容, 来源链接: utcz.com/qa/402980.html