【问题标题】:Convert timeval to time_t将 timeval 转换为 time_t
【发布时间】:2012-02-12 21:30:18
【问题描述】:

如何将 timeval 转换为 time_t?我正在尝试转换: umtp->ut_tv 到 time_t,所以我可以使用 difftime(a,b)。

struct {
   int32_t tv_sec;         /* Seconds */
   int32_t tv_usec;        /* Microseconds */
           } ut_tv;                    /* Time entry was made */
 struct timeval ut_tv;      /* Time entry was made */

【问题讨论】:

  • 你确定微秒对你来说不重要吗?如果是这样,那么您需要编写自己的 struct timeval difftimeval(const struct timeval *t1, const struct timeval *t2); 函数来返回 t2 - t1。或者,如果您愿意,可以将返回类型定义为 double,因此它更接近与 difftime() 的插件兼容。
  • 顺便说一下,显示的代码不会编译;您使用两种不同的类型(作为匿名结构和 struct timeval)定义了两次变量 ut_tv
  • 你从哪里得到timeval的这个定义? tv_sec 的类型应该是time_t 并且不需要进行转换,只有截断。
  • @R 这来自 utmp.h,它是 Linux 的一部分。 @Jonathan,你说得对,在 utmp.h 中声明了两次,我实际上取出了一个 else 语句,所以它真的是一个或另一个。我只能使用 (time_t) utmp->ut_tv.tv.sec

标签: c


【解决方案1】:

time_t 只存储秒数,所以

 time_t time = (time_t)ut_tv.tv_sec;

应该有效,但由于您只是在寻找差异,所以总有 减法的魔力。

struct timeval diff = {a.tv_sec-b.tv_sec, a.tv_usec-b.tv_usec};

这可以让您保持以前的所有精度。

【讨论】:

  • 我使用的是“->”而不是“。”在“.tv_sec”之前
  • 减法没有正确归一化;如果a.tv_usec = 123456b.tv_usec = 654321,那么你最终会得到一个负的小数时间,它应该被标准化为一个正值并且tv_sec 组件被适当地调整。当然,如果a 出现在b 之前,也许结果的两个部分都应该是负数?这是“分段算术”,通常最容易将符号保存在单独的字段中。如果没有单独的符号字段,则两个值段应具有相同的符号(或一个或另一个可以为零)。
  • 我会说除了最重要的字段之外的所有字段都应该是非负的。
  • @R..:在您打印出负值之前,它可以正常工作。当您的意思是 -0.100000 时,打印 -1.900000 是一种让用户感到高兴的事情。或者,至少在打印时,您必须对数字进行标准化。当然,无论如何,您都必须这样做;除其他外,您必须使用%06d%.6d 打印小数部分,并确保它是正数;再说一次,如果你省略了宽度规范,你可以通过将 1 µs 打印为 0.1 来误导人们,这也不好!处理没有符号位的有符号分段数字需要付出不可忽视的努力。
【解决方案2】:

不使用 c-cast,您可以简单地这样做:

struct timeval rawtime_s_us;
gettimeofday( &rawtime_s_us, NULL );
time_t rawtime_s = rawtime_s_us.tv_sec;

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 2012-03-18
    • 2013-03-22
    • 2014-01-16
    • 2011-03-14
    • 2013-10-24
    • 2013-06-23
    • 2015-05-06
    相关资源
    最近更新 更多