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