linux系统提供了多个用于获取时间的函数,不同的函数对应不同的时间精度和使用场景,开发者可以根据实际需求选择合适的函数来实现时间获取功能。

常用时间获取函数介绍
1. time函数
time函数是linux下最基础的时间获取函数,用于获取当前系统的日历时间,精度为秒级,返回的是从1970年1月1日0时0分0秒(UTC)到当前时刻的秒数,也就是常说的Unix时间戳。
该函数的原型定义在<time.h>头文件中,函数声明如下:
#include <time.h> time_t time(time_t *tloc);
如果参数tloc不为空,函数会将获取到的时间戳同时存储到tloc指向的内存中,函数执行成功会返回时间戳,失败则返回-1。
下面是一个简单的使用示例:
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time;
// 获取当前时间戳
current_time = time(NULL);
if (current_time == -1) {
printf("获取时间失败n");
return 1;
}
printf("当前时间戳为:%ldn", current_time);
return 0;
}
2. gettimeofday函数
gettimeofday函数可以获取更高精度的时间,精度可以达到微秒级,除了返回秒级的时间戳之外,还能返回微秒级的偏移量。该函数同样定义在<time.h>头文件中,函数原型如下:
#include <sys/time.h> #include <time.h> int gettimeofday(struct timeval *tv, struct timezone *tz);
其中tv参数是指向timeval结构体的指针,用于存储获取到的时间,timeval结构体定义如下:
struct timeval {
time_t tv_sec; // 秒数
suseconds_t tv_usec; // 微秒数
};
tz参数用于获取时区信息,现在大多场景下该参数传入NULL即可,函数执行成功返回0,失败返回-1。
使用示例:
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
int main() {
struct timeval tv;
int ret = gettimeofday(&tv, NULL);
if (ret == -1) {
printf("获取时间失败n");
return 1;
}
printf("当前时间戳:%ld 秒,%ld 微秒n", tv.tv_sec, tv.tv_usec);
return 0;
}
3. clock_gettime函数
clock_gettime函数是posix标准定义的时间获取函数,支持更高的时间精度,最高可以达到纳秒级,并且可以根据传入的时钟类型获取不同类型的时间,比如系统实时时间、进程运行时间等。该函数定义在<time.h>头文件中,原型如下:
#include <time.h> int clock_gettime(clockid_t clk_id, struct timespec *tp);
clk_id是时钟类型,常用的有CLOCK_REALTIME(系统实时时间,和time函数获取的时间基准一致)、CLOCK_MONOTONIC(单调时间,从系统启动开始计算,不受系统时间调整影响)等。tp参数是指向timespec结构体的指针,用于存储获取到的时间,timespec结构体定义如下:
struct timespec {
time_t tv_sec; // 秒数
long tv_nsec; // 纳秒数
};
函数执行成功返回0,失败返回-1。
使用示例:
#include <stdio.h>
#include <time.h>
int main() {
struct timespec ts;
// 获取系统实时时间
int ret = clock_gettime(CLOCK_REALTIME, &ts);
if (ret == -1) {
printf("获取时间失败n");
return 1;
}
printf("当前时间:%ld 秒,%ld 纳秒n", ts.tv_sec, ts.tv_nsec);
return 0;
}
时间转换相关函数
获取到时间戳之后,很多时候需要将其转换为人类可读的本地时间或者UTC时间,linux也提供了对应的转换函数。
localtime函数
localtime函数可以将time_t类型的时间戳转换为本地时区对应的struct tm结构体时间,struct tm结构体包含了年、月、日、时、分、秒等详细的时间字段。函数原型如下:
#include <time.h> struct tm *localtime(const time_t *timep);
参数timep是要转换的时间戳指针,函数返回指向struct tm结构体的指针,需要注意的是该函数返回的是静态分配的内存,多线程场景下使用可能存在问题,多线程场景可以使用localtime_r函数。
使用示例:
#include <stdio.h>
#include <time.h>
int main() {
time_t current_time = time(NULL);
struct tm *local_tm = localtime(¤t_time);
if (local_tm == NULL) {
printf("时间转换失败n");
return 1;
}
printf("本地时间:%d年%d月%d日 %d:%d:%dn",
local_tm->tm_year + 1900, // tm_year是从1900年开始的年数
local_tm->tm_mon + 1, // tm_mon是0-11,需要加1
local_tm->tm_mday,
local_tm->tm_hour,
local_tm->tm_min,
local_tm->tm_sec);
return 0;
}
不同函数的适用场景
不同的时间获取函数有不同的适用场景,开发者可以根据需求选择:
- 如果只需要秒级精度的时间戳,优先选择time函数,使用简单,兼容性好。
- 如果需要微秒级精度的时间,可以选择gettimeofday函数,不过该函数在新的posix标准中已经被标记为废弃,推荐使用clock_gettime替代。
- 如果需要纳秒级精度,或者需要获取单调时间(比如计算程序运行耗时,避免系统时间调整的影响),选择clock_gettime函数。
- 如果需要将时间戳转换为可读的本地时间,使用localtime或者localtime_r函数。
注意事项
在使用这些时间函数时,需要注意几个问题:
1. 所有时间相关的结构体定义都在<time.h>头文件中,使用前需要包含对应的头文件。
2. 多线程场景下使用localtime函数可能存在线程安全问题,建议使用可重入版本localtime_r函数。
3. gettimeofday函数虽然精度比time高,但已经被posix标准废弃,新的开发项目建议优先使用clock_gettime函数。
4. 使用clock_gettime函数时,需要确认系统支持对应的时钟类型,部分嵌入式系统可能不支持CLOCK_MONOTONIC等时钟类型。
linuxgettimeofdaytimeclock_gettimelocaltime修改时间:2026-07-23 07:48:33