1. 时间戳转换为日历时间
时间戳是记录的是绝对的秒数或者毫秒数,人类不可读,而日历时间是人类可读时间。可以利用函数 localtime() 将时间戳转换为日历时间。注意,localtime() 函数返回值是 tm 时间类型的指针,对应的是当前电脑系统所在时区的各项时间属性。
#include <stdio.h>
#include <time.h>
void TestLocaltime(){
// 获取当前时间
time_t current_time;
time(¤t_time);
// 将时间戳转换为 tm
struct tm *calendar;
calendar = localtime(¤t_time);
// 利用 tm 输出人类可读时间,注意 tm_year的输出是在1900的基础上输出的,tm_mon是从0开始输出的
printf("%d/%d/%d %d:%d:%d\n",
calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
calendar->tm_hour, calendar->tm_min, calendar->tm_sec);
}
此外,还有一个函数 gmtime() 也可以用于获取 struct tm 时间类型的时间。只不过与 localtime() 相比,gmtime() 返回的是零时区的时间,并非电脑系统对应的时区时间。
void TestGmtime(){
// 获取当前时间
time_t current_time;
time(¤t_time);
// 将时间戳转换为 tm,
// 北京时间
struct tm* calendar;
calendar = localtime(¤t_time);
// 2021/8/9 21:7:2
printf("%d/%d/%d %d:%d:%d\n",
calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
calendar->tm_hour, calendar->tm_min, calendar->tm_sec);
// 零时区时间
struct tm* calendar2 = gmtime(¤t_time);
// 2021/8/9 13:7:2
printf("%d/%d/%d %d:%d:%d\n",
calendar2->tm_year + 1900, calendar2->tm_mon + 1, calendar2->tm_mday,
calendar2->tm_hour, calendar2->tm_min, calendar2->tm_sec);
}
2. 日历时间转换为时间戳
利用函数 mktime() 可以将 struct tm 时间类型转化为 time_t 时间戳。不仅如此,mktime() 还可以对 struct tm 类型的变量进行调整。例如 calendar 的秒数被赋值为 70,那么 mktime() 可以让其自动进位,分钟值加1,秒值变为10。
void TestMktime(){
// 获取当前时间
time_t current_time;
time(¤t_time);
printf("current_time: %lld\n", current_time);
// 将时间戳转换为 tm
struct tm *calendar;
calendar = localtime(¤t_time);
calendar->tm_sec = 80;
// 2021/8/9 20:58:80
printf("%d/%d/%d %d:%d:%d\n",
calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
calendar->tm_hour, calendar->tm_min, calendar->tm_sec);
// 将 tm 转为时间戳,并且调整 tm 的时间数据,使其自动进位
time_t current_time2 = mktime(calendar);
printf("current_time2: %lld\n", current_time2);
// 2021/8/9 20:59:20,与上面相比,自动进位
printf("%d/%d/%d %d:%d:%d\n",
calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
calendar->tm_hour, calendar->tm_min, calendar->tm_sec);
}