簡體   English   中英

time(time_t * arg)如何舍入毫秒或秒分數?

[英]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()指導,因為現在的小數部分被截斷了。

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

該標准未指定確切的行為,但是最可能的行為是截斷任何小數秒。

例如,我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM