如何获得Linux上的当前时间(以毫秒为单位)?
Answers:
这可以使用POSIXclock_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
if (ms > 999) {
s++;
ms = 0;
}
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
(intmax_t)s, ms);
}
如果您的目标是测量经过的时间,并且系统支持“单调时钟”选项,则应考虑使用CLOCK_MONOTONIC
而不是CLOCK_REALTIME
。
gcc
命令。
s
,这种情况发生时您将需要增加。可能是罕见的事件,但多余的数字可能会引起麻烦。
以下是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; // calculate milliseconds
// printf("milliseconds: %lld\n", milliseconds);
return milliseconds;
}
关于时区:
gettimeofday()支持指定时区,我使用NULL,它忽略时区,但是如果需要,您可以指定时区。
@Update-时区
由于long
时间的表示与时区本身无关或不受其影响,因此tz
没有必要设置gettimeofday()的参数,因为它不会有任何区别。
并且,根据的手册页gettimeofday()
,该timezone
结构的使用已过时,因此tz
通常应将参数指定为NULL,有关详细信息,请检查手册页。
tz
参数不会得到任何警告,并且它对结果没有任何影响,这是有道理的,因为时间的表示与时间无关或没有影响按时区本身,对吗?gettimeofday()
&(struct timezone tz = {480, 0})
long
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
来自Dan Moulding的POSIX答案,这应该可以工作:
#include <time.h>
#include <math.h>
long millis(){
struct timespec _t;
clock_gettime(CLOCK_REALTIME, &_t);
return _t.tv_sec*1000 + lround(_t.tv_nsec/1.0e6);
}
也正如David Guyon指出的那样:使用-lm进行编译