一、时间类型及常用函数
(1)时间类型
本地时间(locale time)
格林威治时间(Greenwich Mean Time GMT)
世界标准时间 (Universal Time Coordinated UTC)
GMT、UTC时间,都是以秒数为单位计数:
-
时间是从1970年01月01日 0:00:00起到现在经过的秒数。
-
NTP时间是从1900/1/1 00:00:00开始算
#include <time.h>
#include <stdio.h>int main()
{
time_t timep; //用来存储从1970年到现在经过了多少秒
time(&timep); //获取time_t类型的当前时间
printf("%ld\n", timep);
printf("%s", ctime(&timep));
return 0;
}
得到:1539332642
通过函数ctime()将其转换为真实世界时间:Fri Oct 12 16:30:01 2018
(2)常用时间函数举例
因为时区不同的关系,不同函数取得的时间会相差8个小时(北京处于东八区)。简单举例:
获得UTC时间:time()、asctime()、gmtime()… …
获得经时区转换后的时间:ctime()、localtime()… …
#include <time.h>
#include <stdio.h>
int main()
{
time_t timep;
time(&timep);
printf("%ld\n", timep);
printf("北京时间:%s", ctime(&timep));
printf("UTC时间:%s", asctime(gmtime(&timep)));
return 0;
}
更多与时间相关的内容可参考这个博客:
c++ 时间类型详解(time_t和tm)
Linux C++中的时间函数(转)
(3)UTC时间转换成秒,再转换成当前时间
#include <time.h>
#include <stdio.h>
/*
struct tm
{
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一 */
int tm_yday; /* 从每年1月1日开始的天数– 取值区间[0,365],其中0代表1月1日 */
int tm_isdst; /* 夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0 */
};
*/
typedef struct RTSPUTCTime
{
int year;
int mon;
int day;
int hour;
int min;
int second;
} RTSPUTCTime;
time_t utc2seconds(RTSPUTCTime *utc)
{
struct tm tm_time;
memset(&tm_time, 0, sizeof(tm_time));
tm_time.tm_year = utc->year - 1900;
tm_time.tm_mon = utc->mon;
tm_time.tm_mday = utc->day;
tm_time.tm_hour = utc->hour;
tm_time.tm_min = utc->min;
tm_time.tm_sec = utc->second;
return mktime(&tm_time);
}
int main()
{
struct tm *tm_now;
RTSPUTCTime utc = {2019,3,15,9,30,15}; // 给定一个UTC时间
time_t seektime = utc2seconds(&utc); // 将UTC时间转化为秒
tm_now = localtime(&seektime); // 将秒转化为当前时间
printf("tm_now =%d-%d-%d %d:%d:%d \n",tm_now->tm_year+1900, tm_now->tm_mon, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);
}
参考