gmtime和localtime的区别
一、time函数
time_t time(time_t *tloc);返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果参数 tloc 不为空,则返回值也存储在变量tloc中;当参数为NULL时直接返回秒数。
二、struct tm结构体
man文档的官方描述
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
中文翻译
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 到 11 */
int tm_year; /* 自 1900 起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
三、asctime函数
- 函数声明:
char *asctime(const struct tm *timeptr) - 函数功能:
char *asctime(const struct tm *timeptr) 返回一个指向字符串的指针,它代表了结构 struct timeptr 的日期和时间。 - 函数参数:
timeptr 是指向 tm 结构的指针 - 函数返回值:
该函数返回一个 C 字符串,包含了可读格式的日期和时间信息 Www Mmm dd hh:mm:ss yyyy,其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示一月中的第几天,hh:mm:ss 表示时间,yyyy 表示年份。 - 实例
#include <stdio.h>
#include <string.h>
#include <time.h>
int main()
{
struct tm t;
t.tm_sec = 10;
t.tm_min = 10;
t.tm_hour = 6;
t.tm_mday = 25;
t.tm_mon = 2;
t.tm_year = 89;
t.tm_wday = 6;
puts(asctime(&t));
return(0);
}
输出:Sat Mar 25 06:10:10 1989
四、gmtime和localtime函数
1.gmtime
- 函数声明:
struct tm *gmtime(const time_t *timep); - 函数功能:
gmtime()将time函数得到的秒数转换成一个UTC时间的结构体struct tm; - 函数参数:
time_t类型的常量指针,一般是是time()函数得到的秒数。 - 函数返回值:
返回struct tm的结构体指针
2.localtime
- 函数声明:
struct tm *localtime(const time_t *timep); - 函数功能:
localtime()将time函数得到的秒数转换成一个UTC时间的结构体struct tm; - 函数参数:
time_t类型的常量指针,一般是是time()函数得到的秒数。 - 函数返回值:
返回struct tm的结构体指针
3.区别
- gmtime()得到的是0时区,把UTC时间转换成北京时间的话,需要小时数加上8。
- localtime()得到的是本地时间,该函数同gmtime函数唯一区别是,在转换小时数不需要加上8了。localtime是将时区考虑在内了,转出的当前时区的时间。但是注意,有些嵌入式设备上被裁减过的系统,时区没有被设置好,导致二者转出来的时间都是0时区的。
4.代码示例
#include <time.h>
#include <stdio.h>
int main(int argc, char **argv)
{
time_t timer;
struct tm *tblock;
timer = time(NULL);
tblock = gmtime(&timer);
printf("gmtime方法:%s\n", asctime(tblock));
tblock = localtime(&timer);
printf("localtime方法:%s\n", asctime(tblock));
return 0;
}
结果:
gmtime方法:Tue Apr 02 02:10:49 2024
localtime方法:Tue Apr 02 10:10:49 2024
注意:gmtime和localtime函数返回的地址是一个静态变量的地址,且地址是相同的。也就是第二次调用,会把第一调用时的值擦除,写入第二次的值。
#include <time.h>
#include <stdio.h>
int main(int argc, char **argv)
{
time_t timer;
struct tm *tblock1;
struct tm *tblock2;
timer = time(NULL);
tblock1 = gmtime(&timer);
printf("gmtime方法:%s\n", asctime(tblock1));
printf("%x\n",tblock1);
tblock2 = localtime(&timer);
printf("localtime方法:%s\n", asctime(tblock2));
printf("%x\n",tblock2);
return 0;
}
结果:
gmtime方法:Tue Apr 02 02:15:30 2024fc85e30
localtime方法:Tue Apr 02 10:15:30 2024fc85e30
可见,gmtime和localtime返回的地址是同一片区域。此外,连续调用gmtim或localtime也是一样的,其每次返回的地址区域都是一样的。