将纪元时间转换为“实际”日期/时间

我想做的是将一个纪元时间(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;

}

你可以假设成员secondsminuteshoursmonthday,和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

回到顶部