本篇博客主要介绍 Linux 编程中常用的时间处理函数,包括获取当前时间、时间戳转换为本地时间、时间格式转换等等。
1. 获取当前时间
在 Linux 编程中,常常需要获取当前时间进行一些操作,例如计算程序的运行时间、记录日志等等。下面介绍两个常用的获取当前时间的函数。
(1) time()
time()
函数是 Linux 中用于获取当前时间戳的函数,定义如下:
#include <>
time_t time(time_t *t);
其中,t
可选,表示存储当前时间的地址。如果传入非空指针,函数会将当前时间的时间戳值存储到该指针指向的内存中,如果不需要存储时间戳值,可以使用 NULL
代替。
time()
函数返回当前的时间戳,即从1970年1月1日至今的秒数,是一个整型数。一般情况下,我们可以使用这个函数来获取当前时间并进行一些时间的计算、转换等操作。
以下是一个示例代码,演示了如何使用time()
函数来获取当前时间戳:
#include <>
#include <>
int main()
{
time_t now;
char time_str[20];
now = time(NULL);
sprintf(time_str, "%ld", now);
printf("当前时间戳:%s秒\n", time_str);
return 0;
}
使用以上代码,可以获得类似以下的输出结果,显示了当前的时间戳:
当前时间戳:1686218947秒
需要注意的是,time()
函数返回的时间戳是和时区无关的,即不受系统时区的影响。如果需要获取本地时间,可以使用 localtime()
函数将时间戳转换为本地时间,并进行以下等操作。
(2) gettimeofday()
gettimeofday()
函数是 Linux 中用于获取当前时间的函数之一,其定义如下:
#include <sys/>
int gettimeofday(struct timeval *tv, struct timezone *tz);
其中,tv 表示时间结构体指针,用于存储获取到的秒数和微秒数;tz 参数已经不被使用了,传入 NULL
即可。
gettimeofday()
函数的作用是获取当前的时间戳(秒级和微秒级),并存储到传入的 tv
结构体中,其精度可以达到微秒级。相比于 time()
函数,gettimeofday()
函数可以提供更加精细的时间信息,并且在一些需要更高精度的场景中使用。例如,计算程序的运行时间、计算程序的频率等等。
以下是一个示例代码,演示了如何使用 gettimeofday()
函数来获取当前时间戳:
#include <sys/>
#include <>
int main() {
struct timeval tv;
gettimeofday(&tv,NULL);
unsigned long long now = tv.tv_sec * 1000 + tv.tv_usec / 1000;
printf("当前时间戳:%llu毫秒\n", now);
return 0;
}
使用以上代码,可以获得类似以下的输出结果,显示了当前的时间戳:
当前时间戳:1686218909798毫秒
2. 时间戳转换为本地时间
time()
函数获取到的时间戳是一个从 1970 年 1 月 1 日 00:00:00 开始计算的秒数,与本地时间和时区无关。因此,在实际应用中,为了更好地理解和展示时间的含义,我们需要将其转换为本地时间。
在 Linux 编程中,可以使用 localtime()
函数将时间戳转换为本地时间,函数定义如下:
#include <>
struct tm *localtime(const time_t *timep);
其中,timep
表示时间戳指针,指向一个 time_t
类型的时间戳。函数返回值是一个 tm
结构体指针,该结构体表示了转换后的本地时间,其成员包含了年、月、日、时、分、秒等信息。
以下是一个示例代码,演示了如何将时间戳转换为本地时间:
#include <>
#include <>
int main()
{
time_t now;
struct tm *local_time;
now = time(NULL);
local_time = localtime(&now);
printf("本地时间:%d年%d月%d日 %d时%d分%d秒\n",
local_time->tm_year + 1900, local_time->tm_mon + 1, local_time->tm_mday,
local_time->tm_hour, local_time->tm_min, local_time->tm_sec);
return 0;
}
使用以上代码,可以获得类似以下的输出结果,显示了当前的本地时间:
本地时间:2023年6月8日 18时7分53秒
需要注意的是,localtime()
函数返回的时间是本地时间,与时区相关。如果需要将时间转换为 UTC 时间(类似于 GMT 时间),可以使用 gmtime()
函数。该函数与 localtime()
函数类似,但是返回的是 UTC 时间。
3. 时间格式转换
在实际应用中,经常需要对日期和时间进行格式化处理,并将其展示到用户界面上。在 Linux 编程中,可以使用 strftime()
函数完成时间格式化,函数定义如下:
#include <>
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
其中,s
表示存储格式化后字符串的缓冲区,max
表示缓冲区的大小,format
表示输出格式,tm
表示进行格式化的时间。
strftime()
函数的用法类似于 printf() 函数,支持多种转换格式,而且支持本地字符集,可以输出各种国际化的日期和时间格式。下面是一些转换格式的例子:
格式 | 含义 | 示例 |
---|---|---|
%Y | 年(4 位数字) | 2021 |
%m | 月(2 位数字) | 07 |
%d | 日(2 位数字) | 01 |
%H | 小时(24 小时制) | 15 |
%M | 分钟(2 位数字) | 51 |
%S | 秒(2 位数字) | 08 |
%a | 星期缩写 | Thu |
%A | 星期全称 | Thursday |
%b | 月份缩写 | Jul |
%B | 月份全称 | July |
%c | 完整的日期和时间表示 | Thu Jul 1 15:51:08 2021 |
以下是一个示例代码,演示了如何使用 strftime()
函数将本地时间格式化为规定格式的字符串:
#include <>
#include <>
int main() {
time_t now;
struct tm *local_time;
char time_str[20];
now = time(NULL);
local_time = localtime(&now);
strftime(time_str, sizeof(time_str),"%Y-%m-%d %H:%M:%S", local_time);
printf("格式化后的时间:%s\n", time_str);
return 0;
}
使用以上代码,可以获得类似以下的输出结果,显示了当前的时间的规定格式:
格式化后的时间:2023-06-08 18:09:52
总结
本文主要介绍了 Linux 编程中时间处理的几个常用函数:获取当前时间戳、将时间戳转换为本地时间和时间格式转换。这些函数功能强大,灵活运用可以为我们的程序和系统带来很大的便利。希望本文能够对大家有所帮助。