[英]How is time(time_t *arg) rounding milliseconds or second fractions?
我要知道會怎樣
time(NULL)
當前系統時間為時返回
1997-07-16T19:20:30.49+01:00
要么
1997-07-16T19:20:30.50+01:00
如果time()
報告秒數(最常見的time_t
),則肯定會截斷,否則可能會報告現在是明天。
C沒有指定它,但這是time()
的唯一合理實現。
請參閱類似gettimeofday的擴展,這些擴展明確提供了分數和time_t
。
相對較新的標准C函數int timespec_get(struct timespec *ts, int base)
確實提供了可能適用於time()
指導,因為現在的小數部分被截斷了。
如果
base
為TIME_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);
}
}
該標准未指定確切的行為,但是最可能的行為是截斷任何小數秒。
例如,我在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);
}
當第二個增量時,輸出以下內容:
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
它將忽略NULL並返回自紀元開始(即1970年1月1日)以來的時間(以秒為單位)。而且,time_t與時間函數不同。 毫秒將被截斷,計時器的粒度取決於設置以及硬件粒度。 某些系統使用插值來獲得超過秒的軟時間。 如果要討論Linux中的時間,請參見: http : //man7.org/linux/man-pages/man7/time.7.html ,在那里您將發現硬件實時與軟件實時之間的明顯區別。 去看一下吉卜賽,以及如何設置硬件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.