Skip to content

Latest commit

 

History

History
104 lines (55 loc) · 2.7 KB

八、时间.md

File metadata and controls

104 lines (55 loc) · 2.7 KB

时间的基本概念

  • UTC:世界调和时间,是国际时间标准,不受时区限制

  • GMT:格林威治时间,零时区的时间

  • Epoch:时间戳,UTC时间是从1970年1月1日0时0分0秒开始的一个整数值

  • 时间戳比格式化日期更好用,因为只需一个长整型就能存储,而且比较大小也更加方便

  • 常见种类

    • time_t:时间戳
    • clock_t:CPU运行时间
    • timespec(msvc):纳秒
    • timeb:毫秒
    • timeval(Unix):微妙

获取系统时间

  • 获取时间戳(毫秒)的两种方式

    • 传地址,改变原值
    • 传NULL,接收新值
  • 平台限制

    • Windows
    • Unix
    • Mac

获取日历时间

  • 在localtime中传入一个时间戳对应的地址,会自动将这个时间戳对应的数据转换为一个tm具体的日期

  • 注意tm格式,年份从1900年开始,秒的范围是[0,60],月份从0开始

  • 不能修改一个tm格式的字段,会自动修正,想做到可以使用mktime函数把这个tm格式转换为一个时间戳

  • gmtime是零时区的日期,返回一个tm格式

格式化时间

  • asctime传递一个tm格式的数据

  • ctime传递一个tm格式的指针

  • strftime

    • char* _Buffer:缓冲字符串,用来接收值
    • size_t _SizeInBytes:每次读取多少字节
    • char const* _Format:以什么格式输出,参考官方文档
    • struct tm const* _Tm:tm格式的数据
  • sprintf给字符串追加内容

解析时间

  • sscanf函数

    • C 库函数 int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入

    • 把第一个参数的信息,通过第二个参数的格式,输入到之后参数里

    • int main()
      {
         int day, year;
         char weekday[20], month[20], dtm[100];
      
         strcpy( dtm, "Saturday March 25 1989" );
         sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );
      
         printf("%s %d, %d = %s\n", month, day, year, weekday );
          
         return(0);
      }
      
      //打印结果:March 25, 1989 = Saturday
  • 通过sscanf把一个字符串的信息按照某种格式赋值给一个tm格式的不同字段,手动更新一些字段的值为了贴合tm格式,接着通过mktime函数修正时间

计算时间差

  • difftime

  • 精确到毫秒

  • clock()返回的是处理器消耗的时间,更能真实的反映程序运行的耗时

  • time()返回的是系统时间,更适合描述真实世界的时间变化