时间获取函数
获取utc标准时间
c语言提供了主要两个函数time
以及localtime
来处理时间,。以及提供了time_t
以及struct tm
结构体来获取时间的具体信息。
time_t now; // 声明一个time_t类型的变量now,time_t类型变量(本质是整数,存储秒数)
time(&now); // 调用time()函数, 将当前时间戳(秒数)写入now变量
struct tm *t = localtime( &now ); //上面经过time函数后,now里填充的是从1970年到当前时间的秒数,经过localtime函数格式化,转换为年月日...的本地时间(以struct tm结构体的形式表示),返回指向该结构体的指针,用t接收。接下来就可以打印这个结构体。得到格式化的本地时间了。
-
time_t now;
:声明一个time_t
类型的变量now
。time_t
是 C 标准库中定义的用于表示时间的类型,通常是整数类型,用于存储从 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC )开始到当前的秒数。 -
time(&now);
:调用time
函数获取当前时间。time
函数的参数是一个指向time_t
类型的指针,这里将now
的地址&now
传入,函数会把获取到的当前时间(从 Unix 纪元开始的秒数 )存储到now
变量中。该函数若成功执行,会返回相同的时间值(即存储到now
中的值 ),若失败则返回 - 1 。 -
struct tm *t = localtime( &now );
:调用localtime
函数,将now
变量存储的时间值(从 Unix 纪元开始的秒数,属于 UTC 时间 )转换为本地时间。localtime
函数的参数是指向time_t
类型的指针,这里传入&now
。函数会将转换后的本地时间以struct tm
结构体形式表示,并返回指向该结构体的指针,这里用指针变量t
接收。struct tm
结构体包含年、月、日、时、分、秒等时间信息成员 。 -
time()
获取原始时间戳(秒数)。 -
localtime()
将秒数转换为本地时间的年、月、日等字段。 -
通过
struct tm
访问这些字段或进一步格式化为字符串。
time()
函数
-
头文件:
#include <time.h>
-
语法:
time_t time(time_t *t)
-
参数:
-
t
是指向time_t
类型的指针,用于存储函数获取的当前时间值(从 Unix 纪元 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数)。如果传递NULL
,函数会返回当前时间值,但不存储它 。
-
-
返回值:
-
成功时,返回当前时间值(从 Unix 纪元起的秒数),类型为
time_t
; -
失败时,返回 - 1 。
-
localtime()
函数
-
头文件:
#include <time.h>
-
语法:
struct tm *localtime(const time_t *timer)
-
参数:
-
timer
是指向time_t
类型的指针,通常传入time()
函数获取的时间值(从 Unix 纪元起的秒数) 。
-
-
返回值:
-
成功时,返回一个指向
struct tm
结构体的指针,该结构体包含了转换后的本地时间信息,如年、月、日、时、分、秒等 。struct tm
结构体在<time.h>
中定义
-
time_t now;
time(&now);
struct tm *t = localtime( &now );
例子代码:
#include <time.h>
int main(){
time_t t; time(&t); struct tm *now = localtime(&t); printf("年份:%d,月份:%d 天数:%d %d:%d:%d 星期%d\n",now->tm_year+1900,now->tm_mon+1,now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec,now->tm_wday);return 0;}
时间运算可以用这个,但是我们现在是要更灵活的格式化时间
时间格式化函数
(1)strftime
-
概念
是一个更灵活的时间格式化函数,它允许用户定义时间的输出格式。使用
strftime
可以定制输出的日期和时间格式。 -
语法
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
-
参数
-
str
是一个字符数组,用于存储格式化后的字符串。 -
maxsize
是str
数组的最大长度。 -
format
是一个格式字符串,它指定了输出格式。 -
timeptr
是指向struct tm
结构体的指针。strftime()
函数的返回值是一个size_t
类型的整数,表示实际写入到目标缓冲区的字符数(不包含字符串终止符\0
)。
-
-
返回值
-
strftime()
函数的返回值是一个size_t
类型的整数,表示实际写入到目标缓冲区的字符数(不包含字符串终止符\0
)。
-
#include <time.h> time_t now; // 定义time_t类型变量,用于存储时间戳(秒数) time(&now); //调用time()函数获取当前时间戳(从1970年1月1日起的秒数),并存储到now中 struct tm *t = localtime( &now );// 将时间戳转换为本地时间(考虑时区),返回struct tm结构体指针 char time[64];// 定义字符数组,用于存储格式化后的时间字符串 int len = sizeof(time) / sizeof(time[0]); 计算数组长度(即64) strftime(time, len ,"%Y年%m月%d日 %H:%M:%S ",t);//格式化时间 printf("当前的时间是:%s \n", time);
封装成函数:
// 版本1:使用静态缓冲区(无需手动释放,但非线程安全)
const char* getTime()
{static char time[64]; // 静态缓冲区,函数返回后仍有效time_t now; // 定义time_t类型变量,用于存储时间戳(秒数)`time(&now); //调用time()函数获取当前时间戳(从1970年1月1日起的秒数),并存储到now中struct tm* t = localtime(&now);// 将时间戳转换为本地时间(考虑时区),返回struct tm结构体指针strftime(time, sizeof(time), "%Y年%m月%d日 %H:%M:%S", t);//格式化时间return time;
}
// 版本2:动态分配内存(需手动free,但线程安全)
char* getTime_dong()
{time_t now; // 定义time_t类型变量,用于存储时间戳(秒数)`time(&now); //调用time()函数获取当前时间戳(从1970年1月1日起的秒数),并存储到now中struct tm* t = localtime(&now);// 计算所需缓冲区大小size_t len = strftime(NULL, 0, "%Y年%m月%d日 %H:%M:%S", t) + 1;//strftime() 函数的返回值是一个size_t类型的整数,表示实际写入到目标缓冲区的字符数(不包含字符串终止符 `\0`,所以加一)。//传入 NULL 和 0 是 strftime() 函数的一种特殊用法,用于在不实际写入字符串的情况下计算所需的缓冲区大小。//也可以直接定义len = 64,直接给一个较大的值char* time = (char*)malloc(len);if (time == NULL) {perror("malloc,failed");exit(EXIT_FAILURE);}// 内存分配失败strftime(time, len, "%Y年%m月%d日 %H:%M:%S", t);return time;
}
// 示例调用
int main()
{// 使用静态缓冲区版本const char* time1 = getTime();printf("静态版本: %s\n", time1);
// 使用动态分配版本char* time2 = getTime_dong();if (time2){printf("动态版本: %s\n", time2);free(time2); // 必须释放内存!}
//直接使用int times[64] = { 0 };time_t t;time(&t);struct tm* now = localtime(&t);strftime(times, sizeof(times), "%Y年%m月%d日,%H:%M:%S",now);printf("%s", times);
return 0;
}