如何从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
将以纳秒为单位给出时间。