【问题标题】:How does the C function time() treat fractional seconds?C 函数 time() 如何处理小数秒?
【发布时间】:2018-01-02 01:01:37
【问题描述】:

time() 函数将返回自 1970 年以来的秒数。我想知道它如何对返回的秒数进行舍入。

例如,对于 100.4s,它会返回 100 还是 101?

有明确的定义吗?

【问题讨论】:

  • 如果时钟分辨率为 9 秒,它可能实际上返回 99 :-)
  • 一般来说时间是,比如1514857893.927648(其中1514857893代表2018-01-02 01:51:33 +00:00),那么time()会返回整数部分无舍入 — 1514857893。这不是 C 标准强制要求的; POSIX time() 说:time() 函数应返回 time [CX] ⌦ 自 Epoch 以来的秒数。 ⌫
  • 如果您关心小数秒,请不要使用 time(),而是使用 clock_gettime() 等等...

标签: c


【解决方案1】:

ISO C 标准没有说太多。它只说time() 返回

实现对当前日历时间的最佳近似

结果是time_t 类型,它是“能够表示时间”的实数类型(整数或浮点数)。

许多系统将time_t 实现为有符号整数类型,表示自格林威治标准时间 1970 年 1 月 1 日 00:00:00 以来的整数秒数。

在我的 Ubuntu 系统上做一个快速实验(比较time()gettimeofday() 返回的值)表明time() 返回的值被截断了,例如如果高精度时间是1514866171.750058time() 函数将返回 1514866171。 ISO C 和 POSIX 都不能保证这一点,但我希望它在任何类 UNIX 系统上都能保持一致。

【讨论】:

    【解决方案2】:

    7.27.2.4p3

    时间函数返回实现的最佳近似值 当前日历时间。值 (time_t)(-1) 如果 日历时间不可用。如果 timer 不是空指针,则 返回值也分配给它指向的对象。

    它是由实现定义的,因此除非您指定编译器和操作系统,否则答案是“最佳近似值”。

    【讨论】:

      【解决方案3】:

      有明确的定义吗?

      没有


      http://en.cppreference.com/w/c/chrono/time

      未指定 time_t 中日历时间的编码,但大多数系统符合 POSIX 规范并返回一个整数类型的值,该值包含自 Epoch 以来的秒数。 time_t 是 32 位有符号整数的实现(许多历史实现)在 2038 年失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多