C/C++时间获取及格式化输出汇总
2015-07-26 23:19
2196 查看
这段时间一直在处理服务器产生的日志,需要经常获取时间和格式化输出,所以对C/C++的时间操作总结和归纳一下。在网上找了很多的blog,大多是写函数的具体用法,时间存储结构的含义,并不是不这种介绍方式不好,只是我很难快速从中提取出主要的内容。
time_t 类型定义在头文件 /usr/include/sys/time.h 中:
time_t 类型变量获取函数:time_t time(time_t* lpt):
struct tm类型变量并不能直接获取,通过解析time_t得到:
struct timeb类型变量的获取:
struct timeval类型变量的获取:
clock_t 定义在头文件/usr/include/sys/types.h中:
clock_t 类型变量的获取:
struct timespec结构类型变量的获取:
<这部内容未确认,待考证>
ctime()将time_t类型的时间转换成字符串;
asctime()将struct tm类型的时间转换成字符串。
转换成的时间格式都为”Wed Jun 30 21 :49 :08 1993/n“
时间函数及时间结构之间的关系图
时间的存储结构一般有四种,time_t、struct tm、struct timeval、struct timespec。下图给出了时间存储结构的精度,及其与时间函数的关系图,时间结构及其获取函数
time_t
time_t 类型表示从1970-01-01 00:00:00时开始到现在秒数,精确度:秒(second)。time_t 类型定义在头文件 /usr/include/sys/time.h 中:
#define _TIME_T typedef long time_t; #endif
time_t 类型变量获取函数:time_t time(time_t* lpt):
#include<time.h> time_t ts; ts = time(0); // 方法一 ts = time(NULL); // 方法二 ts = time((size_t)NULL); // 方法三 time(&ts); // 方法四
struct tm
struct tm 结构精度为:秒(second),结构定义如下: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; /* 一星期的日数,从星期一算起,范围为0-6 */ int tm_wday; /* 从1900 年算起至今的年数 */ int tm_yday; /* 从今年1月1日算起至今的天数,范围为0-365 */ int tm_isdst; /* 日光节约时间的旗标 */ };
struct tm类型变量并不能直接获取,通过解析time_t得到:
#include<time.h> struct tm *localtime(const time_t *timep); /* 当前时区时间 */ struct tm *gmtime(const time_t *timep); /* GMT时间 */
struct timeb
struct timeb 结构的精确度:毫秒(10E-3秒)。结构定义如下:struct timeb{ time_t time; /* 为1970-01-01至今的秒数*/ unsigned short millitm; /* 千分之一秒即毫秒 */ short timezonel; /* 为目前时区和Greenwich相差的时间,单位为分钟 */ short dstflag; /* 为日光节约时间的修正状态,如果为非0代表启用日光节约时间修正 */ };
struct timeb类型变量的获取:
#include <sys/timeb.h> int ftime(struct timeb* tp); // 成功返回0;失败返回-1
struct timeval
struct timeval 结构精确度为:微秒(10E-6);结构定义如下:struct timeval { long tv_sec;/* 为1970-01-01至今的秒数*/ long tv_usec;/* 前一秒结束到现在的毫秒数*/ }
struct timeval类型变量的获取:
#include <sys/time.h> int gettimeofday(struct timeval* tv,struct timezone* tz); /* 成功返回0,失败返回-1,错误代码存于errno */ /* 该函数会提取系统当前时间,把时间分为秒和微秒分别填充到结构struct timeval中;把当地的时区信息填充到结构struct timezone中,参数tz用于保存时区结果(若不使用则传入NULL即可)。 */
clock_t
clock_t 类型表示进程占用CPU的时间(微秒数),精度为:微秒(10E-6)。clock_t 定义在头文件/usr/include/sys/types.h中:
#ifndef _CLOCK_T #define _CLOCK_T typedef long clock_t; #endif
clock_t 类型变量的获取:
#include <time.h> clock_t clock(void); /* 以微秒的方式返回进程占用CPU的时间 */
struct timespec
struct timespec结构精确度为:纳秒(10E-9秒);它是POSIX.4标准定义的一个时间结构;结构定义如下:struct timespec { time_t tv_sec; /* 为1970-01-01至今的秒数*/ long tv_nsec; /* 前一秒结束到现在的纳秒数*/ };
struct timespec结构类型变量的获取:
<这部内容未确认,待考证>
int clock_gettime(clockid_t, struct timespec *) /* 获取特定时钟的时间,常用如下4种时钟: CLOCK_REALTIME 系统当前时间,从1970年1.1日算起 CLOCK_MONOTONIC 系统的启动时间,不能被设置 CLOCK_PROCESS_CPUTIME_ID 本进程运行时间 CLOCK_THREAD_CPUTIME_ID 本线程运行时间 */ typedef struct timespec timespec_t; // </usr/include/sys/time_impl.h 中定义> extern void gethrestime(timespec_t*); extern void gethrestime_lasttick(timespec_t*);
时间格式转换
ctime()和asctime()
ctime()和asctime()将不同结构的时间转换成真实世界所使用的(当前时区)时间日期表示方法,然后将结果以字符串形态返回。ctime()将time_t类型的时间转换成字符串;
asctime()将struct tm类型的时间转换成字符串。
转换成的时间格式都为”Wed Jun 30 21 :49 :08 1993/n“
strftime()/strptime()
C/C++提供了一个自定义时间格式的函数strftime(),和一个将自定义时间格式转化为struct tm结构的函数strptime():#include<time.h> size_t strftime( char *strDest, /* 存放格式化后的字符串缓存 */ size_t maxsize, /* 最多可以输出的字符数 */ const char *format, /* 时间输出格式 */ const struct tm *timeptr /* 待转换的时间 */) char *strptime( const char *buf, /* 待转换的格式化字符串 */ const char *format, /* 字符串的时间格式 */ struct tm *timeptr /* 转换后的时间 */) 可使用的格式化字符串: %a af60 星期几的简写 %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 时区名称,如果不能得到时区名称则返回空字符。 %% 百分号
时间获取函数的效率对比
<待加入代码和效果进行完善>相关文章推荐
- C语言中EOF与Ctrl+Z
- C++调用c# dll
- C++课程设计——停车场管理系统
- C++中的虚函数表是什么时期建立的?
- c/c++基础
- C++ transform
- C++primer——阅读笔记(非面向对象)
- C++ string的大小写转换
- 我的C++笔记(数据的共享与保护)
- C++位运算详解
- C++实现简单的内存块自动管理
- hihocoder#1040判断矩形
- C++ 获取类成员函数地址方法 浅析
- C++ 中间statickeyword
- C++ 中在进程中的窗口句柄传入线程
- Dev-Cpp/Mingw32 环境介绍
- stm32中的C语言(7.24)
- C/C++ memmove 和 memcpy
- 找数达人
- C++ 宏、范型和RTTI 浅析