如何从Linux中的C获取毫秒的当前时间?

如何在毫秒内获得Linux上的当前时间?

这可以使用clock_gettime函数来实现。

在当前版本的POSIX中, gettimeofday被标记为已过时 。 这意味着它可能会从未来版本的规范中删除。 鼓励应用程序编写者使用clock_gettime函数而不是gettimeofday

这是一个如何使用clock_gettime的例子:

 #define _POSIX_C_SOURCE 200809L #include <inttypes.h> #include <math.h> #include <stdio.h> #include <time.h> void print_current_time_with_ms (void) { long ms; // Milliseconds time_t s; // Seconds struct timespec spec; clock_gettime(CLOCK_REALTIME, &spec); s = spec.tv_sec; ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n", (intmax_t)s, ms); } 

如果您的目标是测量已用时间,并且您的系统支持“单调时钟”选项,那么您应该考虑使用CLOCK_MONOTONIC而不是CLOCK_REALTIME

你必须这样做:

 struct timeval tv; gettimeofday(&tv, NULL); double time_in_mill = (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond 

以下是以毫秒为单位获取当前时间戳的util函数:

 #include <sys/time.h> long long current_timestamp() { struct timeval te; gettimeofday(&te, NULL); // get current time long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // caculate milliseconds // printf("milliseconds: %lld\n", milliseconds); return milliseconds; } 

关于时区

gettimeofday()支持指定时区,我使用NULL ,它忽略时区,但如果需要,您可以指定一个时区。


@Update – 时区

由于时间的long表示与时区本身无关,所以设置gettimeofday()的tz参数是没有必要的,因为它没有任何区别。

而且,根据gettimeofday() 手册页, timezone结构的使用已经过时,因此tz参数通常应该指定为NULL,详情请查看手册页。

使用gettimeofday()获得以秒和微秒为单位的时间。 结合和舍入到毫秒是作为一个练习。

C11 timespec_get

它返回到纳秒,四舍五入到实现的决议。

它已经在Ubuntu 15.10中实现了。 API看起来与POSIX clock_gettime相同。

 #include <time.h> struct timespec ts; timespec_get(&ts, TIME_UTC); struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; 

更多细节在这里: https : //stackoverflow.com/a/36095407/895245

如果您正在查找要键入到命令行中的内容,则date +%H:%M:%S.%N将以纳秒为单位给出时间。