而tm数据类型存的值,可以是utc时间,或是本地时区时间,具体得看不同功能函数,例如,
1、
定义函数:struct tm *localtime(const time_t * timep);
函数说明:localtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。结构tm 的定义请参考gmtime()。此函数返回的时间日期已经转换成当地时区。
返回值:返回结构tm 代表目前的当地时间。
2、
定义函数:struct tm *gmtime(const time_t *timep);
函数说明:gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。
此函数返回的时间日期未经时区转换,而是UTC 时间。
返回值:返回结构tm 代表目前UTC 时间。
注释:
EVENTLOGRECORD这个结构体中的TimeGennerated(DWORD类型,即unsigned long)这个变量存的值也是以一个时间点(一般是1970年1月1日0时0分0秒)到当前时刻的秒数的形式存放的。估计,TimeGennerated(DWORD类型,即unsigned long)这个变量存的值也是utc时间,而不是本地时区时间。
time_t 为__int64,DWORD为unsigned long时,
time_t *pTime=(time_t *)&TimeGennerated是存在隐患的,例如:
time_t *pTime=(time_t *)&TimeGennerated;
tm * pTM=gmtime(pTime);
asctime(pTM);
执行asctime(pTM);时会出现中断,提示有一个断言条件不满足。
将time_t *pTime=(time_t *)&TimeGennerated改为
time_t Time=(time_t )TimeGennerated则不会有事,
因为将表示小范围的数据类型(这里指DWORD)的值转换为用表示大范围的数据类型(这里指time_t )来表示时,数据在数据类型转换时是不会引起丢失的。
附加:
头文件:#include <time.h>
定义函数:char *asctime(const struct tm * timeptr);
函数说明:asctime()将参数timeptr 所指的tm 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格式为:"Wed Jun 30 21:49:08 1993\n"
返回值:返回一字符串表示目前当地的时间日期.
附加说明:
若再调用相关的时间日期函数,此字符串可能会被破坏。此函数与ctime 不同处在于传入的参数是不同的结构。
范例
#include <time.h>
main(){
time_t timep;
time (&timep);
printf("%s", asctime(gmtime(&timep)));
}
注释:
由于asctime()函数已经自己会将UTC时间转换成当地时间,所以一般是gmtime()函数返回的tm变量(即UTC时间)作为asctime()函数的参数,而不是localtime())函数返回的tm变量(即当地时间)。虽然localtime())函数返回的tm变量(即当地时间)作为asctime()函数的参数时作为asctime()函数执行不会有错,但是作为asctime()函数所得的结果值并不正确。
还有一点,asctime()函数返回的字符串是一个ASCII码字符集的字符串,这个可以从该函数名中的asc可以看出来,所以我们不可能用它来显示带中文的日期字符串,虽然asctime()函数返回值的数据类型为char,而我们知道char数据类型的变量不仅可以存储以ASCII码字符集编码的字符,也可以存储以多字节字符集(如简体中文字符集GBK)编码的字符,但是由于asctime()函数设计编程时只支持返回一个ASCII码字符集的字符串,而不支持返回一个以多字节字符集(如简体中文字符集GBK)编码的字符串,具体可以从如下asctime()函数大概实现代码中可以看出:
char *asctime(const struct tm * p)
{
char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
printf ("%d%d%d ", (1900+p->tm_year), (l+p->tm_mon), p->tm_mday);
printf("%s%d:%d:%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
}
下面是asctime()函数返回的字符串的字符串格式:"Wed Jun 30 21:49:08 1993\n"
参考: