我想得到当前的时间戳,并打印出使用 fprintf。
fprintf
使用第二精度,可以打印从 gettimeofday()函数获得的 timeval结构的 tv_sec字段。例如:
gettimeofday()
timeval
tv_sec
#include <sys/time.h> #include <stdio.h> int main() { struct timeval tv; gettimeofday(&tv, NULL); printf("Seconds since Jan. 1, 1970: %ld\n", tv.tv_sec); return 0; }
编译和运行示例:
$ gcc -Wall -o test ./test.c $ ./test Seconds since Jan. 1, 1970: 1343845834
但是,请注意,它已经有一段时间,因此 long int被用来适应这些天的秒数。
long int
还有一些函数可以打印人类可读的时间。详情请参阅 本手册。这里有一个使用 ctime()的例子:
ctime()
#include <time.h> #include <stdio.h> int main() { time_t clk = time(NULL); printf("%s", ctime(&clk)); return 0; }
运行和输出示例:
$ gcc -Wall -o test ./test.c $ ./test Wed Aug 1 14:43:23 2012 $
对于32位系统:
fprintf(stdout, "%u\n", (unsigned)time(NULL));
对于64位系统:
fprintf(stdout, "%lu\n", (unsigned long)time(NULL));
正在强制转换由 time()返回的值
time()
#include <stdio.h> #include <time.h> int main(void) { printf("Timestamp: %d\n",(int)time(NULL)); return 0; }
你想要什么?
$ gcc -Wall -Wextra -pedantic -std=c99 tstamp.c && ./a.out Timestamp: 1343846167
从 C11开始,要获得新纪元以来的微秒,可移植的方法是使用
int timespec_get(struct timespec *ts, int base)
不幸的是,C11还不是随处可用的,因此到目前为止,最接近可移植的是使用 POSIX 函数 clock_gettime或 gettimeofday之一(在 POSIX.1-2008中标记为过时,建议使用 clock_gettime)。
clock_gettime
gettimeofday
这两个函数的代码几乎相同:
#include <stdio.h> #include <time.h> #include <stdint.h> #include <inttypes.h> int main(void) { struct timespec tms; /* The C11 way */ /* if (! timespec_get(&tms, TIME_UTC)) { */ /* POSIX.1-2008 way */ if (clock_gettime(CLOCK_REALTIME,&tms)) { return -1; } /* seconds, multiplied with 1 million */ int64_t micros = tms.tv_sec * 1000000; /* Add full microseconds */ micros += tms.tv_nsec/1000; /* round up if necessary */ if (tms.tv_nsec % 1000 >= 500) { ++micros; } printf("Microseconds: %"PRId64"\n",micros); return 0; }
#include <stdio.h> #include <time.h> int main () { time_t seconds; seconds = time(NULL); printf("Seconds since January 1, 1970 = %ld\n", seconds); return(0); }
并将得到类似的结果: 1970年1月1日以来的秒数 = 1476107865
一个重要的问题是考虑是否基于两个时间戳之间的差异执行任务,因为如果使用 gettimeofday()生成任务,甚至在设置系统时间的同时使用 clock_gettime(CLOCK_REALTIME,..)生成任务,将会得到奇怪的行为。
clock_gettime(CLOCK_REALTIME,..)
为了防止这样的问题,改用 clock_gettime(CLOCK_MONOTONIC_RAW, &tms)。
clock_gettime(CLOCK_MONOTONIC_RAW, &tms)