时间(time_t * arg)如何舍入毫秒或秒的分数?

时间:2018-01-04 20:40:21

标签: c

我需要知道

会是什么
time(NULL)

当前系统时间为:

1997-07-16T19:20:30.49+01:00

1997-07-16T19:20:30.50+01:00

3 个答案:

答案 0 :(得分:4)

如果time()报告秒数(最常见的time_t),则肯定会截断,否则可能会报告 now 明天。

C没有指定这个,但它是time()唯一合理的实现。

查看gettimeofday等明确提供分数和time_t

的扩展程序

一个相对较新的标准C函数int timespec_get(struct timespec *ts, int base)确实提供了可能适用于time()的指导,因为 now 的小数部分被截断。

  

如果baseTIME_UTC,则tv_sec成员将设置为自实施定义时期以来的秒数,被截断为整数值以及tv_nsec成员设置为纳秒的整数,四舍五入到系统时钟的分辨率。

样本用法:

#include <stdio.h>
#include <time.h>

void print_now(void) {
  struct timespec ts = { 0 };
  int base = timespec_get(&ts, TIME_UTC);
  if (base) {
    printf("%lld.%09ld\n", (long long) ts.tv_sec, ts.tv_nsec);
  }
}

答案 1 :(得分:4)

标准没有指定确切的行为,但最可能的行为是截断任何小数秒。

举个例子,我在CentOS7上运行了以下命令:

//div[contains(@class,'additional-practice-location')]//div[@class='practice-location']/text()[preceding::strong[contains(text(), 'Phone')][1]]

当第二个增加时输出以下内容:

time_t t;
struct timeval tv;
int i;

for (i=0;i<500000;i++) {
    t = time(NULL);
    gettimeofday(&tv, NULL);
    printf("t=%ld, tv=%ld.%06ld\n", t, tv.tv_sec, tv.tv_usec);
}

答案 2 :(得分:0)

它将忽略NULL并返回自1970年1月1日纪元开始以来的秒数。 此外,time_t与时间函数不同。毫秒将被截断,并且计时器的粒度取决于设置以及硬件粒度。 有些系统使用插值来获得超过秒的软时间。 如果在Linux中讨论时间,请参阅:http://man7.org/linux/man-pages/man7/time.7.html,在那里您会发现硬件实时和软实时之间有明显的区别。去看看jiffies,以及如何设置硬件。