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 指定的文件不存在。
相关文章推荐
- C语言的错误点
- 算法练习 - 字符串包含
- c语言:在屏幕上输出图案
- State(状态)设计模式
- ubuntu上运行C程序
- C++ -> 向量(vector)
- GNU 嵌入式汇编
- C/C++中取消宏定义
- C语言-指针
- 设计一个线程安全的单例(Singleton)模式
- C++中的三种继承及public、private、protected继承特点总结
- C++顶层const,顶层const,引用总结
- c#调用c++开发的dll const char* 返回值接收问题
- 详解C++中命名空间的意义和用法
- c#调用c++开发的dll const char* 返回值接收问题
- dumpbin命令查看dll导出函数
- c语言:易错的if语句
- c语言:条件表达式的应用
- c语言:&&和||的关系
- c语言:0的按位取反结果