如何在 Linux 中用 C 获取当前时间(以毫秒为单位)?
- 2024-10-24 08:50:00
- admin 原创
- 78
问题描述:
如何以毫秒为单位获取 Linux 上的当前时间?
解决方案 1:
这可以使用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
",
(intmax_t)s, ms);
}
如果您的目标是测量经过的时间,并且您的系统支持“单调时钟”选项,那么您应该考虑使用CLOCK_MONOTONIC
而不是CLOCK_REALTIME
。
解决方案 2:
你必须做这样的事:
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
解决方案 3:
以下是获取当前时间戳(以毫秒为单位)的实用函数:
#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
", milliseconds);
return milliseconds;
}
关于时区:
gettimeofday()支持指定时区,我使用NULL,忽略时区,但如果需要,您可以指定时区。
@Update-时区
由于long
时间的表示与时区本身无关或不受其影响,因此设置tz
gettimeofday() 的参数是没有必要的,因为它不会产生任何区别。
并且,根据的手册页gettimeofday()
,该结构的使用timezone
已经过时,因此该tz
参数通常应指定为 NULL,有关详细信息,请检查手册页。
解决方案 4:
用于gettimeofday()
获取秒和微秒的时间。合并并四舍五入为毫秒留作练习。
解决方案 5:
C11timespec_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
解决方案 6:
源自 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/1e6);
}
David Guyon 还指出:使用 -lm 进行编译
解决方案 7:
此版本不需要数学库,并检查了clock_gettime()的返回值。
#include <time.h>
#include <stdlib.h>
#include <stdint.h>
/**
* @return milliseconds
*/
uint64_t get_now_time() {
struct timespec spec;
if (clock_gettime(1, &spec) == -1) { /* 1 is CLOCK_MONOTONIC */
abort();
}
return spec.tv_sec * 1000 + spec.tv_nsec / 1e6;
}
解决方案 8:
Jirka Justra 的答案返回一个 long,通常为 32 位。自 1970 年 unix 时间 0 以来的毫秒数需要更多位,因此数据类型应为 long long 或 unsigned long long,通常为 64 位。此外,正如 Kevin Thibedeau 所评论的那样,舍入可以在不转换为浮点或使用 math.h 的情况下完成。
#include <time.h>
long long millis () {
struct timespec t ;
clock_gettime ( CLOCK_REALTIME , & t ) ;
return t.tv_sec * 1000 + ( t.tv_nsec + 500000 ) / 1000000 ;
}
如果您要测量少于 50 天的时间,32 位就足够了。大多数计算机上的数据类型 int 是 32 位或 64 位,因此数据类型可以是 unsigned int。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件