Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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_t*arg)如何舍入毫秒或秒分数?_C - Fatal编程技术网

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

C 时间(time_t*arg)如何舍入毫秒或秒分数?,c,C,我需要知道会发生什么 time(NULL) 当前系统时间为时返回: 1997-07-16T19:20:30.49+01:00 或 它将忽略NULL并返回自1970年1月1日纪元开始以来的时间(以秒为单位)。 此外,时间与时间函数不同。毫秒将被截断,计时器的粒度取决于设置和硬件粒度。 有些系统使用插值来获得超过秒的软时间。 如果在Linux中谈论时间,请看以下内容:,在这里您将发现硬件实时和软件实时之间的明显区别。去看看jiffies,看看硬件是如何设置的 如果time()报告秒数(最常见的t

我需要知道会发生什么

time(NULL)
当前系统时间为时返回:

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


它将忽略NULL并返回自1970年1月1日纪元开始以来的时间(以秒为单位)。 此外,时间与时间函数不同。毫秒将被截断,计时器的粒度取决于设置和硬件粒度。 有些系统使用插值来获得超过秒的软时间。 如果在Linux中谈论时间,请看以下内容:,在这里您将发现硬件实时和软件实时之间的明显区别。去看看jiffies,看看硬件是如何设置的

如果
time()
报告秒数(最常见的
time\u t
),它肯定会截断,否则它可能会报告现在是明天

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

请参阅这样的扩展明确提供分数和时间


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

如果
base
TIME\u UTC
,则
tv\u sec
成员设置为自实现定义的历元起的秒数,截断为整数值,
tv\u 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);
  }
}
#包括
#包括
立即作废打印(作废){
结构timespec ts={0};
int base=timespec\u get(&ts,TIME\u UTC);
如果(基本){
printf(“%lld.%09ld\n”,(长)ts.tv\u sec,ts.tv\u nsec);
}
}

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

例如,我在CentOS7上运行了以下程序:

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);
}

你试过什么?这取决于你的平台。毕竟,
时间\u t
可能不需要进行任何舍入-它可能是纳秒数。查看
mktime()
(带区域更改)或
mkgmtime()
)和
time()
。很可能它只是截断了fractionHi@chux,我澄清了我的问题。我什么都没试过。我想知道我提到的两个案例的基本策略是什么,以及它会带来什么回报。我怀疑是一个经典的数学舍入,所以第二个将比第一个多出整整一秒,但我不知道如何不经询问就获得信息,因为我不是C专家。如果
time\u t
报告秒数(最常见的
时间\u t
,它肯定会被截断,否则它可能会报告现在是明天。请参阅类似“显式提供分数”这样的扩展。@chux将
时间\u t
类型设置为以秒为单位的整数计数。在一致性系统上,它不会是纳秒。@DanielH OP询问非整数实际时间是多少四舍五入到最接近的第二个值:向上还是向下?
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);
}
t=1515099481, tv=1515099481.990469
t=1515099481, tv=1515099481.990469
t=1515099481, tv=1515099481.990470
t=1515099481, tv=1515099481.990470
t=1515099481, tv=1515099481.990470
t=1515099482, tv=1515099482.003241
t=1515099482, tv=1515099482.003250
t=1515099482, tv=1515099482.003250
t=1515099482, tv=1515099482.003251