用与用户无关的等价物替换time()和localtime()

时间:2009-04-12 04:10:34

标签: c++ c time clock localtime

我有一个程序使用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);

3 个答案:

答案 0 :(得分:1)

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

只需向time_t添加一个(可能是否定的)值即可更改时间,确保该值不会溢出,然后照常使用localtime

答案 1 :(得分:0)

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

但是,如果您希望能够控制返回的值,那么您需要自己定义time()(或gettimeofday())的代理。大多数库都按照Plauger The Standard C Library中描述的方式设计,您通常可以提供一个名为time()的函数,它可以根据需要运行,替换标准版本。或者,更安全的是,您可以修改代码以调用您自己设计的函数,可能称为simulated_time(),对于生产工作,您可以simulated_time()调用真实的time()(可能通过C99和C ++中的内联函数)但它可以是您自己的版本,可根据需要安排更改时间。

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

答案 2 :(得分: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时,它会使用进度的时间量更新起始点。 (注意,我还没有测试过代码,如果需要,你可以直接使用struct)。

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