zoukankan      html  css  js  c++  java
  • 经常使用时间函数总结

    在计算机中,时间通常有三个作用:表示时间、计时和定时。本文将主要介绍一些经常使用的表示时间的函数,以及他们之间的转换,对于其他的使用方法,在兴许中补充。
    一、基本概念
         1. 世界标准时间(UTC, Coorainated Universal Time)是最基本的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标注年时间(GMT,Greenwich Mean Time),在大多数场合,UTC与GMT等同,仅仅是GMT不再由科学界精确定义。
         2. 本地时间(Local time)指相对于UTC/GMT时间的本地时间(时区转换)。比方,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。
         3. 日历时间(Calendar time)是从一个标准时间点(epoch)到如今的时间经过的秒数,不包含插入闰秒对时间的调整。開始计时的标准时间点,各种编译器一般使用1970年1月1日0时0秒。日历时间用数据类型time_t表示。time_t类型实际上通常是32位或64位整数类型。
    注:闰秒是在协调世界时(UTC)中添加�或降低一秒,使它与平太阳时贴近所做调整。
         4. 时钟滴答数(clock tick),从进程启动開始计时,因此这是相对时间。每秒钟包括CLOCKS_PER_SEC(time.h中定义的常量,一般为1000)个时钟滴答。时钟滴答数用数据类型clock_t表示。clock_t类型通常是32位整数类型。
         5. 分解时间(broken-down time),用结构数据类型tm表示,tm包括下列结构成员:
    #ifndef _TM_DEFINED
    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()为负。*/
     };
    #define _TM_DEFINED
    #endif
    二、转换时间概览
    时间转换概览
         当中,asctime、ctime、gmtime、localtime四个函数是非线程安全的,其相应的线程安全的版本号为asctime_r、ctime_r、gmtime_r、localtime_r.
    三、各个函数的具体说明
    1. mktime
         time_t mktime(struct tm* ptm)
         从分解时间tm到日历时间time_t的转换。
    2. timegm
         time_t timegm(struct tm* brokentime)
         从分解时间tm(被视作UTC时间,不考虑本地时区设置)到日历时间time_t的转换。该函数较少被使用。
    3. gmtime
         struct tm* gmtime(const time_t* timer)
         从日历时间time_t到分解时间tm的转换。函数返回的是一个静态分配的tm结构存储空间,该存储空间被gmtime, localtime与ctime函数所共用. 这些函数的每一次调用会覆盖这块tm结构存储空间的内容。
    4. localtime
         struct tm* localtime(const time_t* timer)
         从日历时间time_t到分解时间tm的转换,即结果数据已经调整到本地时区与夏令时。
    5. asctime
         char *asctime(const struct tm* tmptr)
         把分解时间tm输出到字符串,结果的格式为"Www Mmm dd hh:mm:ss yyyy",即“周几 月份数 日数 小时数:分钟数:秒钟数 年份数”。函数返回的字符串为静态分配,长度不大于26,与ctime函数共用。函数的每次调用将覆盖该字符串内容。
    6. ctime
         char* ctime(const time_t* timer)
         把日历时间time_t timer输出到字符串,输出格式与asctime函数一样.
    7. strftime
         size_t strftime(char* s, size_t n, const char* format, const struct tm* tptr)
        把分解时间tm转换为自己定义格式的字符串,类似于常见的字符串格式输出函数sprintf。
    8. strptime
         char * strptime(const char* buf, const char* format, struct tm* tptr)
         strftime的逆操作,把字符串依照自己定义的格式转换为分解时间tm。
    附:strptime和strftime中使用的格式化命令:
    %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 每周的第几天,星期一为第一天(值从0到6,星期一为0)
    %U 第年的第几周,把星期日做为第一天(值从0到53)
    %V 每年的第几周,使用基于周的年
    %w 十进制表示的星期几(值从0到6,星期天为0)
    %W 每年的第几周,把星期一做为第一天(值从0到53)
    %x 标准的日期串
    %X 标准的时间串
    %y 不带世纪的十进制年份(值从0到99)
    %Y 带世纪部分的十进制年份
    %z,%Z 时区名称,假设不能得到时区名称则返回空字符。
    %% 百分号


    參考文献:
  • 相关阅读:
    git 问题集
    es7集群安装配置及常用命令
    idea maven项目操作kafka--生产者和消费者
    linux中kafka集群搭建及常用命令
    xampp 支持php版本,支持php5.2的最后一版xampp——xampp-1.7.1
    TCP和UDP的区别及各自优缺点区别
    Qt容器(QHash/QMap等)基本学习记录
    linux系统剪切
    简单网络IP探索
    C++(Qt)线程与锁
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4048943.html
Copyright © 2011-2022 走看看