【问题标题】:Replacing time() and localtime() with user-independent equivalents将 time() 和 localtime() 替换为与用户无关的等效项
【发布时间】:2009-04-12 04:10:33
【问题描述】:

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

【问题讨论】:

    标签: c++ c time clock localtime


    【解决方案1】:

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

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

    【讨论】:

    • 我同意,将您的内部时间存储为纪元时间的偏移量。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      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 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 2014-08-29
        • 2018-04-03
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多