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

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 指定的文件不存在。

你可能感兴趣的:(C++,时间处理头文件)