C++标准库——时间相关

来源:互联网 发布:动态壁纸软件情侣 编辑:程序博客网 时间:2024/05/20 05:56

1. time.h和ctime

功能:提供了跨平台支持的时间处理函数,满足了一般通用的时间处理相关操作。

1.time.h

C语言中的原生支持的跨平台时间和日期处理函数以及类型定义。之所以强调跨平台,就是因为这些函数和类型定义的通用性。
类型定义:

typedef long time_t;   //定义了当前时间和日期到1970年1月1日的秒数typedef long clock_t;  //时钟的滴答数,用来标识处理器时间struct tm{    int tm_sec;     /* Seconds: 0-59 (K&R says 0-61?) */    int tm_min;     /* Minutes: 0-59 */    int tm_hour;    /* Hours since midnight: 0-23 */    int tm_mday;    /* Day of the month: 1-31 */    int tm_mon;     /* Months *since* january: 0-11 */    int tm_year;    /* Years since 1900 */    int tm_wday;    /* Days since Sunday (0-6) */    int tm_yday;    /* Days since Jan. 1: 0-365 */    int tm_isdst;   /* +1 Daylight Savings Time, 0 No DST, -1 don't know */};

上述定义确定了基本时间处理的单位。另外提供了常用的基本时间处理函数,均是语言内置的原生提供。

clock_t clock (void);  //返回处理器当前时钟滴答数time_t time (time_t*); //将当前时间戳放置在传入的指针time_t参数中,同时也返回这个时间戳double difftime (time_t, time_t); //比较两个time_t时间戳的差time_t mktime (struct tm*); //传入tm日期时间结构,返回对应的时间戳char* asctime (const struct tm*); //将tm日期时间结构转换为字符串表示,字符串为标准格林威治时间字符串char* ctime (const time_t*); //将time_t时间戳转为标准格林威治时间字符串struct tm*  gmtime (const time_t*); //将时间戳转为格林威治时区的tm结构struct tm*  localtime (const time_t*); //将时间戳转为本地时区的tm结构size_t strftime (char*, size_t, const char*, const struct tm*); //第一个为保存的字符串,第二个参数为字符串长度,第三个为格式化时间字符串,最后一个是tm结构。将tm结构表示的时间信息按照格式化字符串保存到指定的字符串中

上述定义去掉了编译器所需的宏定义,仅给出函数原型。这些函数也是其他很多基于C语言实现的语言中原生支持的时间处理函数。

2.ctime

功能:与time.h相同
ctime是C++对C语言中的time.h头文件的封装,简单包含了time.h头文件,并将所有全局的时间处理函数放置在了std命名空间内:

namespace std{  using ::clock_t;  using ::time_t;  using ::tm;  using ::clock;  using ::difftime;  using ::mktime;  using ::time;  using ::asctime;  using ::ctime;  using ::gmtime;  using ::localtime;  using ::strftime;}

C++建议使用ctime头文件,这样避免了命名污染。

3.实例

time_t now;time_t ret = time(&now);cout << now << '|' << ret << endl;double diff = difftime(res, now);cout << diff << endl;struct tm * tms = gmtime(&now);char * timestr = ctime(&now);cout << timestr << '|' << tms->tm_year << endl;char * timestr2 = asctime(&now);cout << timestr2<<endl;time_t mkt = mktime(tms);cout << mkt << endl;char buf[60];size_t n = strftime(buf, 60, "%Y-%m-%d %H:%M:%S", tms);cout << buf << endl;

1449542726 | 1449542726
0
Tue Dec 8 10:45:26 2015 | 115
Tue Dec 8 10:45:26 2015
1449542726
2015-12-8 10:45:26

ctime和time.h头文件中的时间处理用于日常应用,基本可以满足需求,最小时间单位为秒。但是如果需要使用精确的计时处理函数,可以使用clock函数结合处理器的频率来进行。

2.sys/time.h和sys/utime.h

通用的clock函数在处理精确计时问题时任然显得不太全面,这时就需要结合操作系统特有的API接口进行。sys/time.h和sys/utime.h就是linux系统提供的精确到微妙级的计时头文件。

1.sys/time.h

功能:提供了linux系统下精度到微妙级别的计时函数和类型定义。
定义类型:

struct timeval {  long tv_sec;  long tv_usec;};struct timezone{  int tz_minuteswest; /* of Greenwich */  int tz_dsttime;     /* type of dst correction to apply */};

提供的唯一函数就是gettimeofday,获取当前时间精确到微妙的函数:

int gettimeofday(struct timeval *, void *  /*tzp (unused)*/);

第一个参数给出保存当前时间的timeval结构指针,第二个参数未使用,一般传入NULL即可。
除了上述函数外,还定义了三个宏函数,分别是timerisset,timercmp和timerclear。分别用来控制系统内部的计时器。

2.sys/utime.h

功能:utime()用来修改参数filename文件所属的inode存取时间。

struct utimbuf{    time_t  actime; //文件访问时间    time_t  modtime; //文件修改时间};int utime (const char*, struct utimbuf*);

第一个参数为文件路径名称字符串,第二个为指定修改的时间结构指针。此函数的操作以及执行它所要求的特权取决于buf参数是否为NULL。
1. 如果参数buf为空指针(NULL),则该文件的存取时间和更改时间全部会设为目前时间。为了执行此操作必须满足下列两个条件之一:进程的有效ID必须等于该文件的所有者ID;或者进程对该文件必须具有写权限
2. 如果参数buf为非空指针,则访问和修改文件被设置为buf所指向结构中的值。此时,进程的有效用户ID必须等于该文件的所有者ID,或者进程必须是一个超级用户进程。对文件具有写权限是不够的。

执行成功则返回0,失败返回-1,错误代码存于errno:

  • EACCESS 存取文件时被拒绝,权限不足
  • ENOENT 指定的文件不存在。
0 0