Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将time()和localtime()替换为与用户无关的等效项_C++_C_Time_Clock_Localtime - Fatal编程技术网

C++ 将time()和localtime()替换为与用户无关的等效项

C++ 将time()和localtime()替换为与用户无关的等效项,c++,c,time,clock,localtime,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->

我有一个程序,它使用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);
#定义ConvertToBCD(x)((x/10)tm#u year%=100;
tm_local->tm_mon++;
时间数据[0]=ConvertToBCD(tm\u local->tm\u year);
timedata[1]=ConvertToBCD(tm\u local->tm\u mon);
timedata[2]=ConvertToBCD(tm\u local->tm\u mday);
时间数据[3]=(tm_local->tm_wday+6)&7;
如果(!(TimeStatus&0x02))tm_local->tm_hour%=12;
timedata[4]=(tm_local->tm_hour<12)?0x00:0x40)| ConvertToBCD(tm_local->tm_hour);
timedata[5]=转换到CD(tm_local->tm_min);
时间数据[6]=转换到CD(tm_本地->tm_秒);

A
在POSIX complient系统下,时间仅为自1970年1月1日0:00:00起的秒数


只需在
time\u t
中添加一个(可能是负数)值来更改时间,确保该值不会溢出,然后像往常一样使用
localtime

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

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


你不需要改变你对
localtime()
的使用;它只需将你给它的
time\t
值转换成
struct tm
;你希望它像往常一样给出答案。

我的理解是,你需要一个内部时钟,它会根据实际时钟的进程进行更新

那么你可以创建如下内容:

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时,它会随着时间的推移更新起始点。(注意,我还没有测试代码,如果您愿意,也可以直接使用该结构)


对于亚秒精度,用等效的gettimeofday替换time()和time\t。对于转换、ascii arting、分解到除第二个计数器以外的任何计数器,您仍然可以使用unix函数。

I concur,将内部时间存储为纪元时间的偏移量。