这看起来似乎任何人都不应该要做的,但我工作在它看来,嵌入式系统(的OpenWRT)内核模块time.h
不包括timespec
和time_t
类型,和clock_gettime
和gmtime
功能,但不包括localtime
, ctime
, time
,或,关键的是, tm
型。
当我试图从gmtime的返回指针转换为我自己的结构,我得到一个段错误。
所以我想我会满足于解决问题的两种方法之一,it'd是巨大的,弄清楚如何获得访问该缺少类型,或者,如何推出自己的方法分解unix时间戳。
这应该是准确的(填写一个的删节仿struct tm
,我的year
使用共同的时代,而不是1900 CE纪元):
struct xtm
{
unsigned int year, mon, day, hour, min, sec;
};
#define YEAR_TO_DAYS(y) ((y)*365 + (y)/4 - (y)/100 + (y)/400)
void untime(unsigned long unixtime, struct xtm *tm)
{
/* First take out the hour/minutes/seconds - this part is easy. */
tm->sec = unixtime % 60;
unixtime /= 60;
tm->min = unixtime % 60;
unixtime /= 60;
tm->hour = unixtime % 24;
unixtime /= 24;
/* unixtime is now days since 01/01/1970 UTC
* Rebaseline to the Common Era */
unixtime += 719499;
/* Roll forward looking for the year. This could be done more efficiently
* but this will do. We have to start at 1969 because the year we calculate here
* runs from March - so January and February 1970 will come out as 1969 here.
*/
for (tm->year = 1969; unixtime > YEAR_TO_DAYS(tm->year + 1) + 30; tm->year++)
;
/* OK we have our "year", so subtract off the days accounted for by full years. */
unixtime -= YEAR_TO_DAYS(tm->year);
/* unixtime is now number of days we are into the year (remembering that March 1
* is the first day of the "year" still). */
/* Roll forward looking for the month. 1 = March through to 12 = February. */
for (tm->mon = 1; tm->mon < 12 && unixtime > 367*(tm->mon+1)/12; tm->mon++)
;
/* Subtract off the days accounted for by full months */
unixtime -= 367*tm->mon/12;
/* unixtime is now number of days we are into the month */
/* Adjust the month/year so that 1 = January, and years start where we
* usually expect them to. */
tm->mon += 2;
if (tm->mon > 12)
{
tm->mon -= 12;
tm->year++;
}
tm->day = unixtime;
}
我的道歉对于所有的幻数。 367 *月/ 12是一个巧妙的方法来产生日历的30/31天序列。 计算可与年中开始在三月直到修正到了最后,这让事情变得容易,因为那时的闰日落在一个“年”的结束。
在用户空间glibc就做了很多工作,至于处理时间表示的“本地”的一部分。 在内核中,这是不可用。 也许你不应该尝试你的模块中与此打扰,如果需要做它在用户空间。
一个time_t
是自1月1日的秒数,1970年UTC使分解到这月,日和年并不难,只要你想要的结果UTC。 有一个一堆可用的源通过谷歌搜索“gmtime的来源” 。 大多数嵌入式系统省去了本地时间处理,因为它是一个小更困难,因为在时区设置和环境的依赖。