文章目录
概要:本期主要介绍C/C++中常见的表达时间的结构体,以及它们之间的转换关系。
一、FILETIME
FILETIME结构保留文件的无符号 64 位日期和时间值。 此值表示自1601 年 1 月 1 日开始以来的 100 纳秒单位数 。
具体结构如下所示:
typedef struct _FILETIME
{
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, FAR *LPFILETIME;
其中 DWORD类型 为unsigned long无符号长整型,dwLowDateTime表示文件时间值的低序 32 位。
dwHighDateTime表示文件时间值的高序 32 位。
二、time_t
在计算机中看到的utc时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。time_t其实是long长整型。
具体结构如下所示:
typedef long time_t;
三、timeval
timeval也是用于表示UTC时间,即从1970年01月01日 0:00:00开始的时间。但是timeval结构可以精确到微秒。
具体结构如下所示:
struct timeval
{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
四、tm
tm结构是用于存储UTC时间,且按照年月日时分秒的结构。
具体结构如下所示:
struct tm
{
int tm_sec; /*秒,正常范围0-59, 但允许至61*/
int tm_min; /*分钟,0-59*/
int tm_hour; /*小时, 0-23*/
int tm_mday; /*日,即一个月中的第几天,1-31*/
int tm_mon; /*月, 从一月算起,0-11 1+p->tm_mon;*/
int tm_year; /*年, 从1900至今已经多少年 1900+ p->tm_year;*/
int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
int tm_isdst; /*日光节约时间的旗标*/
};
五、时间结构之间的转换
引入头文件 #include<time.h>
1.FILETIME --> time_t
time_t FILETIMEToTime_t(FILETIME *pTime)
{
ULARGE_INTEGER ull;//ULARGE_INTEGER 是64位无符号整型结构
ull.LowPart = pTime->dwLowDateTime;
ull.HighPart = pTime->dwHighDateTime;
return ull.QuadPart / 10000000ULL - 11644473600ULL;
}
2.time_t --> tm
struct tm* gmtime(const time_t *timep);
/*将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针*/
stuct tm* localtime(const time_t *timep);
/*和gmtime类似,但是它是经过时区转换的时间。*/
3.tm --> time_t
time_t mktime(struct tm* timeptr);
/*将struct tm 结构的时间转换为从1970年至今的秒数*/
六、时间结构显示为现在的常用时间
1.tm结构
char *asctime(const struct tm* timeptr);
/*将结构中的信息转换为真实世界的时间,以字符串的形式显示*/
/*或者通过自定义输出*/
printf("time: %04d-%02d-%02d %02d:%02d:%02d\n", 1900 + p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec );
2.time_t结构
char *ctime(const time_t *timep);
/*将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样*/
结尾
本期对于C/C++中的时间结构的解析就到这,下期再会:)