• C语言 时间函数的学习


    一直都是以简单的time_t t,time(&t),ctime(&t)来表示时间,后来要以时间为日志文件的名字时,就有点蒙逼了。学习一下。

    tm结构:
    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代表一月) - 取值区间为[0,11] */
     
         int tm_year; /* 年份,其值等于实际年份减去1900 */
     
         int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
     
         int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
     
         int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
    }
    

    获取当地时间的函数 :struct tm *localtime(const time_t * timep);
    获得格林威治时间的函数:struct tm *gmtime(const time_t *timep);
    两个函数的用法是一样的,以localtime为例子说明

    #include <time.h>
    int main()
    {
        char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
        time_t timep;
        struct tm *p;
        time(&timep);
        p = localtime(&timep); //取得当地时间
        printf ("%d/%d/%d ", (1900+p->tm_year), (l+p->tm_mon), p->tm_mday);
        printf("%s%d:%d:%d
    ", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);
    }
    

    执行结果

    2016/06/3 Fri 21:25:34
    

    也有转换成标准格式的函数size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
     
    int main(int argc, char **argv)
     {
         time_t t;
         struct tm *lt;
         char nowtime[24];
     
         t = time(NULL);
         lt = localtime(&t);
     
         memset(nowtime, 0, sizeof(nowtime));
         strftime(nowtime, sizeof(nowtime), "%Y-%m-%d %H:%M:%S", lt);
         printf("nowtime = %s
    ", nowtime);
         return 0;
     }
    

    输出 nowtime = 2016-6-3 21:23:07

    可选择的格式有
    %a 星期几的简写
     
    %A 星期几的全称
     
    %b 月份的简写
     
    %B 月份的全称
     
    %c 标准的日期的时间串
     
    %C 年份的前两位数字
     
    %d 十进制表示的每月的第几天
     
    %D 月/天/年
     
    %e 在两字符域中,十进制表示的每月的第几天
     
    %F 年-月-日
     
    %g 年份的后两位数字,使用基于周的年
     
    %G 年份,使用基于周的年
     
    %h 简写的月份名
     
    %H 24小时制的小时
     
    %I 12小时制的小时
     
    %j 十进制表示的每年的第几天
     
    %m 十进制表示的月份
     
    %M 十时制表示的分钟数
     
    %n 新行符
     
    %p 本地的AM或PM的等价显示
     
    %r 12小时的时间
     
    %R 显示小时和分钟:hh:mm
     
    %S 十进制的秒数
     
    %t 水平制表符
     
    %T 显示时分秒:hh:mm:ss
     
    %u 每周的第几天,星期一为第一天 (值从1到7,星期一为1)
     
    %U 第年的第几周,把星期日作为第一天(值从0到53)
     
    %V 每年的第几周,使用基于周的年
     
    %w 十进制表示的星期几(值从0到6,星期天为0)
     
    %W 每年的第几周,把星期一做为第一天(值从0到53)
     
    %x 标准的日期串
     
    %X 标准的时间串
     
    %y 不带世纪的十进制年份(值从0到99)
     
    %Y 带世纪部分的十制年份
     
    %z,%Z 时区名称,如果不能得到时区名称则返回空字符。
     
    %% 百分号
    

    获取微秒级时间的方法int gettimeofday(struct timeval *tv, struct timezone *tz),目前的时间用tv所指的结构返回,时区信息则存在tz所指的结构里。

    struct timeval
    {
         long tv_sec;/秒/
         long tv_usec;/微秒/
    };
    struct timezone
    {
         int tz_minutestwest;/和格林威治时间差几分钟/
         int tz_dsttime;
    }
    

    一般运用时,置tz为空,只取tv的值。

    #include <sys/time.h>
    #include <stdio.h>
    int main(void)
    {
         int i;
         struct timeval tv;
        
         for(i = 0; i < 4; i++)
         {
              gettimeofday(&tv, NULL);
              printf("%d	%d
    ", tv.tv_usec, tv.tv_sec);
              sleep(1);
         }
     
         return 0;
    }
    
  • 相关阅读:
    MySQL 5.7 在windows下修改max_allowed_packet变量
    linux(redhat)安装jdk1.8
    linux安装jdk1.8之后报错Error: dl failure on line 893的解决办法
    Java中List Set Map 是否有序等总结
    面试题吐槽系列之一
    面试算法——快速排序
    推荐系统——online(上)
    推荐系统架构
    零基础开始推荐系统
    视觉显著性优秀硕士论文总结
  • 原文地址:https://www.cnblogs.com/shenlinken/p/8868309.html
Copyright © 2020-2023  润新知