《Hands-On System Programming with C++》读书笔记之十一
POSIX的时间API time.h
POSIX的时间API是基于标准C的,但在C++中仍然需要使用。
API的类型
POSIX API time.h中定义了三种时间数据类型:
- tm:封装日期和时间的结构体;
- time_t:代表秒的单位,通常是整型;
- clock_t:应用所占用的处理器时间
需要注意还有不同的时间定义:
- System clock:操作系统维护的日期与时间,可能随时被修改
- Steady clock:程序运行时间的计数器
- High-resolution clock:与Steady clock相同,但具有更高精度,常用于作为基准时间测试
time() API
用于返回系统时间。
#include <ctime>
#include <iostream>
int main()
{
auto t = time(nullptr);
std::cout << "time: " << t << '\n'; // 1594069715
time(&t);
std::cout << "time: " << t << '\n'; // 1594069715
}
ctime() typedef
用于将time_t类型指针转换为可以识别的字符串指针。其地址内容不需要释放,也不是线程安全的。
#include <ctime>
#include <iostream>
int main()
{
auto t = time(nullptr);
std::cout << "time: " << ctime(&t) << '\n'; // Mon Jul 6 14:18:20 2020
}
localtime()与gmtime()
用于time_t类型数据的当地时间和格林尼治时间的转换,返回tm类型的结构体。同样是指针类型的转换。
asctime()函数
将tm结构体转换为可读的字符串。
#include <ctime>
#include <iostream>
int main()
{
auto t = time(nullptr);
std::cout << "time: " << asctime(localtime(&t)) << '\n';
// time: Mon Jul 6 14:30:03 2020
std::cout << "time: " << asctime(gmtime(&t)) << '\n';
// time: Mon Jul 6 21:30:03 2020
}
strftime()函数
考虑线程安全和可自定义输出格式,推荐的转换方法是strftime()函数。
#include <ctime>
#include <iostream>
int main()
{
auto t = time(nullptr);
char buf[256] {
};
strftime(buf, sizeof(buf), "%m/%d/%Y", localtime(&t));
std::cout << "time: " << buf << '\n'; // 07/06/2020
strftime(buf, sizeof(buf), "%H:%M", localtime(&t));
std::cout << "time: " << buf << '\n'; // 14:46
strftime(buf, sizeof(buf), "%a %b %d %H:%M:%S %Y", localtime(&t));
std::cout << "time: " << buf << '\n'; // Mon Jul 06 14:46:25 2020
}
difftime()函数
比较两个time_t类型数据的差距。
#include <ctime>
#include <iostream>
#include <unistd.h>
int main()
{
auto t1 = time(nullptr);
sleep(2);
auto t2 = time(nullptr);
std::cout << "diff: " << difftime(t2, t1) << '\n'; // 2
std::cout << "diff: " << t2 - t1 << '\n'; // 2
}
difftime()比直接相减的方法通