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

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

2015-12-08 11:36 513 查看

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 指定的文件不存在。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: