精华内容
下载资源
问答
  • gmtime

    2014-11-14 16:02:06
    定义函数:struct tm *gmtime(const time_t *timep); 函数说明:gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。 结构tm 的定义为 ...
    头文件:#include <time.h>

    定义函数:struct tm *gmtime(const time_t *timep);

    函数说明:gmtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。

    结构tm 的定义为
    1. struct tm{
    2. int tm_sec; //代表目前秒数, 正常范围为0-59, 但允许至61 秒
    3. int tm_min; //代表目前分数, 范围0-59
    4. int tm_hour; //从午夜算起的时数, 范围为0-23
    5. int tm_mday; //目前月份的日数, 范围01-31
    6. int tm_mon; //代表目前月份, 从一月算起, 范围从0-11
    7. int tm_year; //从1900 年算起至今的年数
    8. int tm_wday; //一星期的日数, 从星期一算起, 范围为0-6
    9. int tm_yday; //从今年1 月1 日算起至今的天数, 范围为0-365
    10. int tm_isdst; //日光节约时间的旗标
    11. };
    struct tm{
        int tm_sec;  //代表目前秒数, 正常范围为0-59, 但允许至61 秒
        int tm_min;  //代表目前分数, 范围0-59
        int tm_hour;  //从午夜算起的时数, 范围为0-23
        int tm_mday;  //目前月份的日数, 范围01-31
        int tm_mon;  //代表目前月份, 从一月算起, 范围从0-11
        int tm_year;  //从1900 年算起至今的年数
        int tm_wday;  //一星期的日数, 从星期一算起, 范围为0-6
        int tm_yday;  //从今年1 月1 日算起至今的天数, 范围为0-365
        int tm_isdst;  //日光节约时间的旗标
    };

    此函数返回的时间日期未经时区转换,而是UTC 时间。

    返回值:返回结构tm 代表目前UTC 时间。

    范例
    1. #include <time.h>
    2. main(){
    3. char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    4. time_t timep;
    5. struct tm *p;
    6. time(&timep);
    7. p = gmtime(&timep);
    8. printf("%d%d%d", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday);
    9. printf("%s%d;%d;%d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
    10. }
    #include <time.h>
    main(){
        char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
        time_t timep;
        struct tm *p;
        time(&timep);
        p = gmtime(&timep);
        printf("%d%d%d", (1900+p->tm_year), (1+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);
    }

    执行结果:
    2000/10/28 Sat 8:15:38
    展开全文
  • 测试环境:vmware 7 + Redhat5.5... 使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下: struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct...

    测试环境:vmware 7 + Redhat5.5,系统时间使用UTC,时区为上海。

    1、函数功能介绍
    使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下:
    struct tm *gmtime(const time_t *timep);
    struct tm *gmtime_r(const time_t *timep, struct tm *result);
    struct tm *localtime(const time_t *timep);
    struct tm *localtime_r(const time_t *timep, struct tm *result);

    man手册中对它们的解释如下:

    The gmtime() function converts the calendar time timep to broken-down time representation, expressed in Coordinated Universal Time (UTC). It may return NULL when the year does not fit into an integer. The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions. The gmtime_r() function does the same, but stores the data in a user-supplied struct.

    The localtime() function converts the calendar time timep to broken-time representation, expressed relative to the user’s specified time zone. The function acts as if it called tzset(3) and sets the external variables tzname with information about the current time zone, timezone with the difference between Coordinated Universal Time (UTC) and local standard time in seconds, and daylight to a non-zero value if daylight savings time rules apply during some part of the year. The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions. The localtime_r() function does the same, but stores the data in a user-supplied struct. It need not set tzname。

    翻译如下:
    gmtime() 函数将日历时间timep转换为用UTC时间表示的时间。它可能返回NULL,比如年份不能放到一个整数中。返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖。gmtime_r()函数功能与此相同,但是它可以将数据存储到用户提供的结构体中。

    localtime() 函数将日历时间timep转换为用户指定的时区的时间。这个函数的行为好像是它调用了tzset(3) 并且将外部变量tzname设置为当前时区的信息,将timezone设为UTC和本地标准时间的差值,并且,如果在一年的部分时间使用日光节约规则时将daylight设置为非空值。返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖。localtime_r()函数功能与此相同,但是它可以将数据存储到用户提供的结构体中。它不需要设置tzname。

    2、功能测试

    程序一:

    
    #include <stdio.h>
    
    #include <time.h>
    
    int main()
    
    {
    
    time_t cur_time=time(NULL);
    
    if( cur_time < 0 )
    
    {
    
    perror("time");
    
    return -1;
    
    }
    
    struct tm utc_tm;;
    
    if( NULL == gmtime_r( &cur_time, &utc_tm ) )
    
    {
    
    perror("gmtime" );
    
    return -1;
    
    }
    
    struct tm local_tm;
    
    if( NULL == localtime_r( &cur_time, &local_tm ) )
    
    {
    
    perror("localtime" );
    
    return -1;
    
    }
    
    printf("UTC = %s", asctime(&utc_tm) );
    
    printf("LOC = %s", asctime(&local_tm) );
    
    printf("LOC = %s", ctime(&cur_time) );
    
    return 0;
    
    }
    

    程序输出:

    UTC = Thu Oct 27 09:16:10 2011
    
    LOC = Thu Oct 27 17:16:10 2011
    
    LOC = Thu Oct 27 17:16:10 2011
    
    由于系统时间使用了UTC,可以看到“本地时间= UTC时间 + 8”,输出正确。
    

    程序二:

    #include <stdio.h>
    
    #include <time.h>
    
    int main()
    
    {
    
    time_t cur_time=time(NULL);
    
    if( cur_time < 0 )
    
    {
    
    perror("time");
    
    return -1;
    
    }
    
    struct tm *utc_tm = gmtime( &cur_time );
    
    if( NULL == utc_tm )
    
    {
    
    perror("gmtime" );
    
    return -1;
    
    }
    
    printf("UTC = %s", asctime(utc_tm) );
    
    struct tm *local_tm = localtime( &cur_time );
    
    if( NULL == local_tm )
    
    {
    
    perror("localtime" );
    
    return -1;
    
    }
    
    printf("LOC = %s", asctime(local_tm) );
    
    printf("LOC = %s", ctime(&cur_time) );
    
    return 0;
    
    }
    

    程序输出:

    UTC = Thu Oct 27 09:20:45 2011
    
    LOC = Thu Oct 27 17:20:45 2011
    
    LOC = Thu Oct 27 17:20:45 2011
    
    同样是正确的。
    

    程序三:

    #include <stdio.h>
    
    #include <time.h>
    
    int main()
    
    {
    
    time_t cur_time=time(NULL);
    
    if( cur_time < 0 )
    
    {
    
    perror("time");
    
    return -1;
    
    }
    
    struct tm *utc_tm = gmtime( &cur_time );
    
    if( NULL == utc_tm )
    
    {
    
    perror("gmtime" );
    
    return -1;
    
    }
    
    struct tm *local_tm = localtime( &cur_time );
    
    if( NULL == local_tm )
    
    {
    
    perror("localtime" );
    
    return -1;
    
    }
    
    printf("UTC = %s", asctime(utc_tm) );
    
    printf("LOC = %s", asctime(local_tm) );
    
    printf("LOC = %s", ctime(&cur_time) );
    
    return 0;
    
    }
    

    程序输出:

    UTC = Thu Oct 27 17:21:59 2011
    
    LOC = Thu Oct 27 17:21:59 2011
    
    LOC = Thu Oct 27 17:21:59 2011
    

    这程序输出有错,UTC时间和本地时间相同了,这应该就是由于man文档中描述的“可能会被接下来的任何日期和时间函数调用覆盖”造成的。为验证这个设想,使用程序四:

    程序四:

    #include <stdio.h>
    
    #include <time.h>
    
    int main()
    
    {
    time_t cur_time=time(NULL);
    
    if( cur_time < 0 )
    
    {
    perror("time");
    
    return -1;
    
    }
    
    struct tm *local_tm = localtime( &cur_time );
    
    if( NULL == local_tm )
    
    {
    
    perror("localtime" );
    
    return -1;
    
    }
    
    struct tm *utc_tm = gmtime( &cur_time );
    
    if( NULL == utc_tm )
    
    {
    
    perror("gmtime" );
    
    return -1;
    
    }
    
    printf("UTC = %s", asctime(utc_tm) );
    
    printf("LOC = %s", asctime(local_tm) );
    
    printf("LOC = %s", ctime(&cur_time) );
    
    return 0;
    
    }
    
    程序输出:
    
    UTC = Thu Oct 27 09:24:23 2011
    
    LOC = Thu Oct 27 09:24:23 2011
    
    LOC = Thu Oct 27 17:24:23 2011
    

    验证了该设想。

    3、总结
    使用gmtime和localtime后要立即处理结果,否则返回的指针指向的内容可能会被覆盖,一个好的方法是使用gmtime_r和localtime_r,由于使用了用户分配的内存,这两个函数是不会出错的。

    1 #include <cstdlib>  
    
    2 #include <iostream>  
    
    3 #include <time.h>  
    
    4 #include <stdio.h>  
    
    5   
    
    6 using namespace std;  
    
    7   
    
    8 int main(int argc, char *argv[])  
    
    9 {  
    
    10     time_t tNow =time(NULL);  
    
    11     time_t tEnd = tNow + 1800;  
    
    12     //注意下面两行的区别  
    
    13     struct tm* ptm = localtime(&tNow);  
    
    14     struct tm* ptmEnd = localtime(&tEnd);  
    
    15   
    
    16     char szTmp[50] = {0};  
    
    17     strftime(szTmp,50,"%H:%M:%S",ptm);  
    
    18     char szEnd[50] = {0};  
    
    19     strftime(szEnd,50,"%H:%M:%S",ptmEnd);  
    
    20       
    
    21   
    
    22     printf("%s /n",szTmp);  
    
    23     printf("%s /n",szEnd);  
    
    24       
    
    25   
    
    26     system("PAUSE");  
    
    27     return EXIT_SUCCESS;  
    
    28 }  
    
    
    最后出来的结果是:
    
    21:18:39
    
    21:18:39
    
    和最初想法不一致。
    

    查阅localtime的文档,发现这段话:

    This structure is statically allocated and shared by the functions gmtime and localtime. Each time either one of these functions is called the content of this structure is overwritten.

    也就是说每次只能同时使用localtime()函数一次,要不就会被重写!

    The localtime() function need not be reentrant. A function that is not required to be reentrant is not required to be thread-safe.

    因此localtime()不是可重入的。同时libc里提供了一个可重入版的函数localtime_r();

    Unlike localtime(), the reentrant version is not required to set tzname。

    修改程序:

    
    29 #include <cstdlib>  
    
    30 #include <iostream>  
    
    31 #include <time.h>  
    
    32 #include <stdio.h>  
    
    33   
    
    34 using namespace std;  
    
    35   
    
    36 int main(int argc, char *argv[])  
    
    37 {  
    
    38     time_t tNow =time(NULL);  
    
    39     time_t tEnd = tNow + 1800;  
    
    40   
    
    41     //在这里修改程序  
    
    42     //struct tm* ptm = localtime(&tNow);  
    
    43     //struct tm* ptmEnd = localtime(&tEnd);  
    
    44     struct tm ptm = { 0 };  
    
    45     struct tm ptmEnd = { 0 };  
    
    46     localtime_r(&tNow, &ptm);  
    
    47     localtime_r(&tEnd, &ptmEnd);  
    
    48       
    
    49     char szTmp[50] = {0};  
    
    50     strftime(szTmp,50,"%H:%M:%S",&ptm);  
    
    51     char szEnd[50] = {0};  
    
    52     strftime(szEnd,50,"%H:%M:%S",&ptmEnd);  
    
    53     printf("%s /n",szTmp);  
    
    54     printf("%s /n",szEnd);  
    
    55       
    
    56   
    
    57     system("PAUSE");  
    
    58     return EXIT_SUCCESS;  
    
    59 }  
    
    
    最后出来的结果是:
    
    10:29:06 
    10:59:06
    

    在写代码的时候,经常会用到读取系统时间的函数。很多人都会调用localtime函数来将时间转换本地时间,但是大家往往会忽略了一点,localtime函数不是线程安全的。如果在多线程里调用localtime函数,很可能会出现问题。

    多线程应用里面,应该用localtime_r函数替代localtime函数,因为localtime_r是线程安全的。
    

    struct tm *localtime(const time_t *clock);

    struct tm* localtime_r( const time_t* timer, struct tm* result )

    展开全文
  • localtime和gmtime这两个函数采用了time.h中的一个tm结构体:struct tm{int tm_sec; /* Seconds. [0-60] (1 leap second) */int tm_min; /* Minutes. [0-59] */int tm_hour; /* Hours. [0-23] */int t...

    localtime和gmtime这两个函数采用了time.h中的一个tm结构体:

    struct tm

    {

    int tm_sec;           /* Seconds. [0-60] (1 leap second) */

    int tm_min;           /* Minutes. [0-59] */

    int tm_hour;          /* Hours.   [0-23] */

    int tm_mday;          /* Day.     [1-31] */

    int tm_mon;           /* Month.   [0-11] */

    int tm_year;          /* Year - 1900.  */

    int tm_wday;          /* Day of week. [0-6] */

    int tm_yday;          /* Days in year.[0-365] */

    int tm_isdst;         /* DST.     [-1/0/1]*/

    #ifdef  __USE_BSD

    long int tm_gmtoff;       /* Seconds east of UTC.  */

    __const char *tm_zone;    /* Timezone abbreviation.  */

    #else

    long int __tm_gmtoff;     /* Seconds east of UTC.  */

    __const char *__tm_zone;  /* Timezone abbreviation.  */

    #endif

    };

    这两个函数的原型为:

    struct tm *localtime(const time_t *timep);

    struct tm *gmtime(const time_t *timep);

    具体实现为:

    localtime.c

    ---------------------------------------------------------

    #include #include void cur_time(void);

    int main(int argc,char **argv)

    {

    cur_time();

    return 0;

    }

    void cur_time(void)

    {

    char *wday[]={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};

    time_t timep;

    struct tm *p;

    time(&timep);

    p=localtime(&timep);  /* 获取当前时间 */

    printf("%d年%02d月%02d日",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);

    printf("%s %02d:%02d:%02d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec);

    }

    ---------------------------------------------------------

    gcc localtime.c 后运行a.out结果为:

    2007年12月26日星期三 11:07:15

    gmtime.c

    ---------------------------------------------------------

    #include #include void cur_time(void);

    int main(int argc,char **argv)

    {

    cur_time();

    return 0;

    }

    void cur_time(void)

    {

    char *wday[]={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};

    time_t timep;

    struct tm *p;

    time(&timep);

    p=gmtime(&timep);  /* 获取当前时间 */

    printf("%d年%02d月%02d日",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);

    printf("%s %02d:%02d:%02d\n",wday[p->tm_wday],(p->tm_hour+8),p->tm_min,p->tm_sec);

    }

    -----------------------------------------------------------

    gcc gmtime.c 后运行a.out结果为:

    2007年12月26日星期三 11:08:34

    展开全文
  • 使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下: struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime(const ...

    函数功能介绍

    使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下:
    struct tm *gmtime(const time_t *timep);
    struct tm *gmtime_r(const time_t *timep, struct tm *result);
    struct tm *localtime(const time_t *timep);
    struct tm *localtime_r(const time_t *timep, struct tm *result);

    gmtime() 函数将日历时间timep转换为用UTC时间表示的时间。它可能返回NULL,比如年份不能放到一个整数中。返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖。gmtime_r()函数功能与此相同,但是它可以将数据存储到用户提供的结构体中。

    localtime() 函数将日历时间timep转换为用户指定的时区的时间。这个函数的行为好像是它调用了tzset(3) 并且将外部变量tzname设置为当前时区的信息,将timezone设为UTC和本地标准时间的差值,并且,如果在一年的部分时间使用日光节约规则时将daylight设置为非空值。返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖。localtime_r()函数功能与此相同,但是它可以将数据存储到用户提供的结构体中。它不需要设置tzname。

    总结

    使用gmtime和localtime后要立即处理结果,否则返回的指针指向的内容可能会被覆盖,可以使用gmtime_r和localtime_r替代前者,由于使用了用户分配的内存,这两个函数是不会出错的。

    在写代码的时候,经常会用到读取系统时间的函数。很多人都会调用localtime函数来将时间转换本地时间,但是localtime函数不是线程安全的。如果在多线程里调用localtime函数,很可能会出现问题。

    多线程应用里面,应该用localtime_r函数替代localtime函数,因为localtime_r是线程安全的

    struct tm *localtime(const time_t *clock);

    struct tm* localtime_r( const time_t* timer, struct tm* result )

    下面这篇文章给出了较好实现例子:
    https://blog.csdn.net/q1183345443/article/details/93169133

    展开全文
  • 慎用gmtime和localtime

    2019-07-22 21:59:11
    这两个函数都是获取时间的函数,但是这两个函数不能用于多线程。...如果要避免多线程造成值在使用过程中被改变,就应该使用gmtime_r。及时将获取的值取出来 The gmtime() function converts the calendar time tim...
  • gmtime()方法转换历元到一struct_time以UTC其中dst的标志值始终为0以秒表示时间。如果不设置秒时或None,返回的时间为当前time()。 语法 以下是gmtime()方法的语法: time.gmtime([ sec ]) 参数 sec — 这是秒数...
  • python 时间 gmtime

    千次阅读 2017-04-07 13:20:21
    In [162]: a=time.gmtime(51100) In [163]: a Out[163]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=14, tm_min=11, tm_sec=40, tm_wday=3, tm_yday=1, tm_isdst=0) In [164]: a.tm
  • 利用gmtime获取当前时间 代码如下 import time time.gmtime() 运行结果如下
  • 函数gmtime和localtime的声明如下: struct tm * gmtime (const time_t * timer); struct tm * localtime (const time_t * timer); 它们均接收一个time_t的const指针类型,time_t类型通常是一个大整数值,该整数...
  • 是从MSVC的c runtime抄来的,my_gmtime64_s参数有变更,第二参数不用指针,而是直接传值。 gmtime转的是UTC时间,时区偏移需要在传入前加入。 #define _DAY_SEC (24 * 60 * 60) /* secs in a day */ #define _...
  • c库函数-gmtime()

    2016-11-20 14:50:47
    c库函数struct tm *gmtime(const time_t*timer)使用timer的值来填充tm结构,并用协调世界时(UTC)也被称为格林尼治标准时间(GMT)来表示 声明 下面是gmtime()函数的声明 struct tm *gmtime(const time_t *...
  • 函数名:asctime, ctime, gmtime, localtime, mktime, asctime_r, ctime_r, gmtime_r, localtime_r - 转换日期和时间成分解时间(修正时间)或者ASCII格式的字符串。 概要: #include <time.h> char *...
  • 测试环境:vmware 7 + Redhat5.5...使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下: struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct tm *resul
  • 测试环境:vmware 7 + Redhat5.5,系统... 使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下:  struct tm *gmtime(const time_t *timep);  struct tm *gmtime_r(const time_t
  • linux 中的gmtime和localtime函数 一、gmtime和localtime前后使用会有影响 #include <stdio.h>#include <time.h> int main(int argc, char **ar...
  • time())print(time.time()) #返回当前系统时间戳print(time.ctime()) #返回当前系统时间print(time.ctime(time.time()-86640)) #将时间戳转为字符串print(time.gmtime(time.time()-86640))...
  • 于直接使用mktime和gmtime两个函数进行时间戳转换,前者把日历转为时间戳,后者把时间戳转为日历。 但是程序运行起来发现,gmtime得到的日历数据为乱码!!! 经过调试才发现,这个函数返回值是NULL啊!!! 查看...
  • gmtime 时间是东八区的时间,也就是在日志中,统计一天的结果时,则日志输出会在早上8点才会打印出统计信息,中国位于东八区 而 localtime 才是真正的本地时间,会在凌晨0点左右就输出日志,统计前一天的相关信息,...
  • 这几日发现Linux的mktime与gmtime所处理的数据类型是32位的,即代表时间设置只能设置到2038年,在公司的产品要实现这个时间的突破还是得自己写一个新的处理时间的函数。 作为一个刚毕业的程序员,老板把这个任务...
  • 资料出处:... 测试环境:vmware 7 + Redhat5.5,系统时间使用UTC,时区为上海。  1、函数功能介绍 ... 使用man gmtime或man localtime都可以的得到这几个函数的介绍。... struct tm *gmtime(c
  • Linux —— 时间问题(localtime和gmtime)

    千次阅读 2019-05-28 21:31:27
    2、gmtime函数转换后的时间没有经过时区变换,是UTC时间 ; 3、localtime比uct时间(即世界标准时间)慢8个小时; Linux —— 时间问题(GMT,UTC,DST,CST,CET表示什么) 4、对比代码如下: #include <...
  • 辨析 time gmtime ctime

    千次阅读 2013-04-07 12:24:37
    time,gmtime,ctime的区别如下: 1) time (&timep); 直接用 syscall从os取时间,注意是取UTC时间 2) gmtime 可以把 time_t 转化为 year, month,day, hour, seconds, 直接转化,不考虑时区 3) ctime 把时间...
  • 原文链接:http://blog.csdn.net/csuwzc/article/details/6912104 ,如有侵权,请及时告知,将第一时间处理。 ... 使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下:
  • time.ctime()和time.gmtime()获取的时间不一样 原因是ctime()获取的时间是系统时间(北京时间) 而gmtime()获取的时间是格林尼治时间(英国的标准时间) 对于我们而言,两者之间有8小时时差
  • 时间获取相关函数mktime()、gmtime() mktime() 函数原型:time_t mktime(struct tm *timeptr); 函数功能:将时间转换为自1970年1月1日以来逝去时间的秒数,发生错误时返回-1。也就是是把获取的时间转换成时间戳...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,667
精华内容 7,066
关键字:

gmtime