本篇博客主要介绍 Linux 编程中常用的时间处理函数,包括获取当前时间、时间戳转换为本地时间、时间格式转换等等。
1. 获取当前时间
在 Linux 编程中,常常需要获取当前时间进行一些操作,例如计算程序的运行时间、记录日志等等。下面介绍两个常用的获取当前时间的函数。
(1) time()
time()
函数是 Linux 中用于获取当前时间戳的函数,定义如下:
#include <time.h>time_t time(time_t *t);
其中,t
可选,表示存储当前时间的地址。如果传入非空指针,函数会将当前时间的时间戳值存储到该指针指向的内存中,如果不需要存储时间戳值,可以使用NULL
代替。
time()
函数返回当前的时间戳,即从1970年1月1日至今的秒数,是一个整型数。一般情况下,我们可以使用这个函数来获取当前时间并进行一些时间的计算、转换等操作。
以下是一个示例代码,演示了如何使用time()
函数来获取当前时间戳:
#include <time.h>#include <stdio.h>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/time.h>int gettimeofday(struct timeval *tv, struct timezone *tz);
其中,tv 表示时间结构体指针,用于存储获取到的秒数和微秒数;tz 参数已经不被使用了,传入NULL
即可。
gettimeofday()
函数的作用是获取当前的时间戳(秒级和微秒级),并存储到传入的tv
结构体中,其精度可以达到微秒级。相比于time()
函数,gettimeofday()
函数可以提供更加精细的时间信息,并且在一些需要更高精度的场景中使用。例如,计算程序的运行时间、计算程序的频率等等。
以下是一个示例代码,演示了如何使用gettimeofday()
函数来获取当前时间戳:
#include <sys/time.h>#include <stdio.h>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 <time.h>struct tm *localtime(const time_t *timep);
其中,timep
表示时间戳指针,指向一个time_t
类型的时间戳。函数返回值是一个tm
结构体指针,该结构体表示了转换后的本地时间,其成员包含了年、月、日、时、分、秒等信息。
以下是一个示例代码,演示了如何将时间戳转换为本地时间:
#include <time.h>#include <stdio.h>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;}
使用以上代码,可以获得类似以下的输出结果,显示了当前的本地时间:
本地时间:6月8日 18时7分53秒
需要注意的是,localtime()
函数返回的时间是本地时间,与时区相关。如果需要将时间转换为 UTC 时间(类似于 GMT 时间),可以使用gmtime()
函数。该函数与localtime()
函数类似,但是返回的是 UTC 时间。
3. 时间格式转换
在实际应用中,经常需要对日期和时间进行格式化处理,并将其展示到用户界面上。在 Linux 编程中,可以使用strftime()
函数完成时间格式化,函数定义如下:
#include <time.h>size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
其中,s
表示存储格式化后字符串的缓冲区,max
表示缓冲区的大小,format
表示输出格式,tm
表示进行格式化的时间。
strftime()
函数的用法类似于 printf() 函数,支持多种转换格式,而且支持本地字符集,可以输出各种国际化的日期和时间格式。下面是一些转换格式的例子:
以下是一个示例代码,演示了如何使用strftime()
函数将本地时间格式化为规定格式的字符串:
#include <time.h>#include <stdio.h>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;}
使用以上代码,可以获得类似以下的输出结果,显示了当前的时间的规定格式:
格式化后的时间:-06-08 18:09:52
总结
本文主要介绍了 Linux 编程中时间处理的几个常用函数:获取当前时间戳、将时间戳转换为本地时间和时间格式转换。这些函数功能强大,灵活运用可以为我们的程序和系统带来很大的便利。希望本文能够对大家有所帮助。