您的位置:首页 > 编程语言 > C语言/C++

C/C++时间获取及格式化输出汇总

2015-07-26 23:19 2196 查看
这段时间一直在处理服务器产生的日志,需要经常获取时间和格式化输出,所以对C/C++的时间操作总结和归纳一下。在网上找了很多的blog,大多是写函数的具体用法,时间存储结构的含义,并不是不这种介绍方式不好,只是我很难快速从中提取出主要的内容。

时间函数及时间结构之间的关系图

时间的存储结构一般有四种,time_tstruct tmstruct timevalstruct 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-C++-时间函数