0

我有一个使用 time() 和 localtime() 设置内部时钟的程序,但这需要更改,以便内部时钟独立于用户和“实时”时间。我需要能够设置任何合理的开始时间,并根据程序内部的计时器让它向前计数。关于解决此问题的最佳方法的任何想法?这是摘录:

#define ConvertToBCD(x) ((x / 10) << 4) | (x % 10);
time_t  tm;
time(&tm);
struct tm *tm_local= localtime(&tm);
tm_local->tm_year %= 100;
tm_local->tm_mon++;
timedata[0] = ConvertToBCD(tm_local->tm_year);
timedata[1] = ConvertToBCD(tm_local->tm_mon);
timedata[2] = ConvertToBCD(tm_local->tm_mday);
timedata[3] =  (tm_local->tm_wday + 6) & 7;
if (!(TimeStatus & 0x02)) tm_local->tm_hour %= 12;
timedata[4] = ((tm_local->tm_hour < 12) ? 0x00 : 0x40) | ConvertToBCD(tm_local->tm_hour);
timedata[5] =  ConvertToBCD(tm_local->tm_min);
timedata[6] =  ConvertToBCD(tm_local->tm_sec);
4

3 回答 3

1

A在 POSIX 兼容系统下,只是自epoch 1970 年 1 月 1 日 0:00:00time_t以来的秒数。

只需向 a 添加一个(可能为负)值来time_t更改时间,确保该值不会溢出,然后localtime照常使用。

于 2009-04-12T04:21:48.800 回答
0

如果只需要整秒分辨率,那么time()可以使用;如果您需要亚秒级分辨率,请使用gettimeofday().

但是,如果您希望能够控制返回的值,那么您需要为自己定义一个time()(or gettimeofday()) 的代理项。大多数库都是按照 Plauger 的The Standard C Library中描述的路线设计的,并且您通常可以提供一个调用的函数,该函数time()按照您的意愿运行,以替换标准版本。或者,更安全的是,您可以修改代码以调用您自己设计的函数simulated_time()simulated_time()可能time()称为自己的版本,可以根据需要安排时间进行更改。

您无需更改对localtime();的使用。它只是将time_t您赋予它的任何值转换为struct tm; 您希望它像往常一样给出答案。

于 2009-04-12T07:17:39.657 回答
0

我理解它的方式是你想要一个内部时钟,它会根据真实时钟的进度进行更新。

那么你会创建这样的东西:

struct myTime
{
    time_t userStart;
    time_t systemStart;
    time_t curTime;
};

void initTtime(struct myTime *t, time_t time)
{
    t->userStart=time;
    t->systemStart=time(NULL);
}

time_t getTime(struct myTime *t)
{
    t->curTime = t->userStart + time(NULL)-t->systemStart;
    return t->curTime;
}

所以使用 initTime 你设置你想要的当前时间,这会及时链接到系统时间。当您使用该结构调用 getTime 时,它​​会根据已进行的时间量更新起点。(注意,我没有测试过代码,如果需要,您可以直接使用该结构)。

对于亚秒级精度,将 time() 和 time_t 替换为 gettimeofday 等效项。对于转换、ascii arting、分解为第二个计数器以外的任何东西,您仍然可以使用 unix 函数。

于 2009-04-12T08:06:23.347 回答