zoukankan      html  css  js  c++  java
  • 系统数据文件和信息之时间和日期例程

    由UNIX内核提供的基本时间服务是计算自国际标准时间公元1970年1月1日00:00:00以来经过的秒数。这种秒数是以数据类型time_t表示的。我们称它们为日历时间日历时间包括时间和日期。UNIX在这方面与其他操作系统的区别是:(a)以国际标准时间而非本地时间计时;(b)可自动进行转换,例如变换到夏时制;(c)将时间和日期作为一个量值保存。

    time函数返回当前时间和日期:

    #include <time.h>
    time_t time( time_t *calptr );
    返回值:若成功则返回时间值,若出错则返回-1

    时间值总是作为函数值返回。如果参数不为空,则时间值也存放在由calptr指向的单元内。

    在系统V派生的系统中,调用stime(2)函数,在BSD派生的系统中,则调用settimeofday(2),用于对内核中的当前时间设置初始值。

    与time函数相比,gettiimeofday提供了更高的分辨率(最高为微秒级)。这对于某些应用很重要。

    #include <sys/time.h>
    int gettimeofday( struct timeval *restrict tp, void *restrict tzp );
    返回值:总是返回0

    该函数作为XSI扩展定义在Single UNIX Specification中,tzp的唯一合法值是NULL,其他值则将产生不确定的结果。

    gettimeofday函数将当前时间存放在tp指向的timeval结构中,而该结构存储秒和微秒。

    struct timeval {
        time_t    tv_sec;     /* seconds */
        long      tv_usec;    /* microseconds */
    };

    一旦取得这种以秒计的整型时间值后,通常要调用另一个时间函数将其转换为人们可读的时间和日期。图6-1说明了各种时间函数之间的关系。(图中用虚线表示的四个函数localtime、mktime、ctime和strftime都受到环境变量TZ的影响:如果定义了TZ,则这些函数将使用其值以代替系统默认时区。如果TZ定义为空串(即TZ=),则使用国际标准时间UTC。)

    1365000386_2149

                                           图6-1 各个时间函数之间的关系

    两个函数localtime和gmtime将日历时间转换成以年、月、日、时、分、秒、周日表示的时间,并将这些存放在一个tm结构中。

    struct tm {             /* a broken-down time */
        int     tm_sec;     /* seconds after the minute: [0 - 60] */
        int     tm_min;     /* minutes after the hour: [0 - 59] */
        int     tm_hour;    /* hours after midnight: [0 - 23] */
        int     tm_mday;    /* day of the month: [1 - 31] */
        int     tm_mon;     /* months since January: [0 - 11] */
        int     tm_year;    /* years since 1900 */
        int     tm_wday;    /* days since Sunday: [0 - 6] */
        int     tm_yday;    /* days since January: [0 - 365] */
        int     tm_isdst;   /* daylight saving time flag: [<0, =0, >0] */
    };

    关于上面结构的最后一项tm_isdst(夏时制标志)可参考:http://blog.163.com/caoguoqiang_dlut/blog/static/1065891422011321115144181/

    秒可以超过59的理由是可以表示润秒。注意,除月日字段,其他字段的值都以0开始。如果夏时制生效,则夏时制标志为正;如果为非夏时制时间,则该标志值为0;如果此信息不可用,则其值为负。

    #include <time.h>
    struct tm *gmtime( const time_t *calptr );
    struct tm *localtime( const time_t *calptr );
    两个函数返回值:指向tm结构的指针。

    localtime和gmtime之间的区别是:localtime将日历时间转换成本地时间(考虑到本地时间和夏时制标志),而gmtime则将日历时间转换成国际标准时间的年、月、日、时、分、秒、周日。

    函数mktime以本地时间的年、月、日等作为参数,将其转换成time_t值。

    #include <time.h>
    time_t mktime( struct tm *tmptr );
    返回值:若成功则返回日历时间,若出错则返回-1

    asctime和ctime函数产生大家都熟悉的26字节的字符串,这与date(1)命令的系统默认输出形式类似,例如:

    Mon Jan  6 01:59:18 PST 2014

    #include <time.h>
    char *asctime( const struct tm *tmptr );
    char *ctime( const time_t *calptr );
    两个函数返回值:指向以null结尾的字符串的指针

    asctime的参数是指向年、月、日等字符串的指针,而ctime的参数则是指向日历时间的指针。

    最后一个时间函数是strftime,它是非常复杂的类似于printf的时间值函数。

    #include <time.h>
    size_t strftiime( char *restrict buf, size_t maxsize, 
                const char *restrict format,    
                const struct tm *restrict tmptr );
    返回值:若有空间则返回存入数组的字符数,否则返回0

    最后一个参数是要格式化的时间值,由一个指向tm结构的指针指定。格式化结果存放在一个长度为maxsize个字符的buf数组中,如果buf长度足以存放格式化结果及一个null终止符,则该函数返回在buf中存放的字符数(不包括null终止符),否则该函数返回0。

    format参数控制时间值的格式。如同printf函数一样,转换说明的形式是百分号之后跟一个特定字符。format中的其他字符则按原样输出。两个连续的百分号在输出中产生一个百分号。与printf函数不同的是,每个转换说明产生一个不同的定长输出字符串,在format字符串中没有字段宽度修饰符。

    下表中列出了部分转换说明,更详细的可man strftime查看。

    1365001077_6986 

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    Jmeter设计压力测试场景&请求元件之并发场景设置&Jmeter查看压力测试结果&压力测试结果分析(二十九)
    Jmeter录制APP脚本(二十八)
    Jmeter优化web脚本&Jmeter回放web脚本和联调&Jmeter WEB脚本参数化(二十七)
    Jmeter结合badboy录制脚本(二十六)
    Jmeter录制WEB的原理(二十五)
    Jmeter实践:一粒云项目—Jmeter获取文件列表与下载接口串联测试及上传文件与下载接口之间的串联测试(二十四)
    Jmeter实践:一粒云项目—Jmeter完成文件的列表获取及JSON Extractor获取数组类型的数据及正则表达式获取数组类型的数据(二十三)
    Jmeter实践:一粒云项目—Jmeter完成文件下载及批量完成文件下载(二十二)
    Jmeter实践:一粒云项目—Jmeter完成文件上传及批量完成文件上传(二十一)
    Jmeter实践——新的项目介绍(二十)
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3507715.html
Copyright © 2011-2022 走看看