gmtime()和localtime()函数中time_t、tm分别作用的不同(附带asctime()函数说明)

time_t即__int64)数据类型存的值,都是(认为是)utc时间(即英国格林威治时间,即(东)时区0),且是以一个时间点(一般是1970年1月1日0时0分0秒)到当前时刻的秒数的形式存放的。

而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__int64DWORD为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)));
}

执行
Sat Oct 28 02:10:06 2000


注释:

由于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"

参考:

C语言中time_t数据类型详细介绍

C语言函数手册 分类用途


你可能感兴趣的:(gmtime()和localtime()函数中time_t、tm分别作用的不同(附带asctime()函数说明))