std::chrono::time_point 是c++11引入的一个模板类,用于表示特定的时间点。它通常和std::chrono::duration结合使用,支持加减操作和时间点比较操作。
以下是std::chrono::time_point的常见操作:
1.获取当前时间
cpp#include <chrono> #include <iostream> int main() { auto now = std::chrono::high_resolution_clock::now(); std::cout << "Time captured.\n"; return 0; }
2.加减操作
time_point 和duration 可以直接加减操作,用于计算新的时间点或计算时间差
加时间
cppauto now = std::chrono::high_resolution_clock::now(); auto future_time = now + stf::chrono::seconds(10);// 给当前时间加10秒
减时间
cppauto now = std::chrono::high_resolution_clock::now(); auto past_now = now - std::chrono::minutes(5); // 当前时间减5分钟
3.计算时间差
time_point 可以相减,返回duration 类型,用于计算两个时间点的时间差
cpp#include <iostream> #include <chrono> int main() { auto start = std::chrono::high_resolution_clock::now(); std::this_thread::sleep_for(std::chrono::seconds(2)); auto end = std::chrono::high_resolution_clock::now(); auto elapsed = end - start; std::cout<<"Elapsed time: " << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() << " ms\n"; return 0; }
4.比较操作
time_point 支持比较操作符<,<=,>,>=,==,!=
cppauto now = std::chrono::high_resolution_clock::now(); auto future_time = now + std::chrono::seconds(5); if (future_time > now) { std::cout << "Future time is later than now.\n"; }
5.强制类型转换
时间点的默认单位取决于其时钟类型 如(std::chrono::system_clock 或 std::chrono::high_resolution_clock).可以通过std::chrono::duration_cast将时间点转化为特定的时间单位
cppauto now = std::chrono::high_resolution_clock::now(); auto duration_since_epoch = now.time_since_epoch(); auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration_since_epoch); std::cout <<"Milliseconds since epoch: "<< millis.count() <<'\n';
6.获取时间点的秒、毫秒、微秒
通过time_since_epoch 和std::chrono::duration_cast
cppauto now = std::chrono::system_clock::now(); auto time_sin_epoch = now.time_since_epoch(); auto seconds = std::chrono::duration_cast<std::chrono::seconds>(time_since_epoch); auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(time_since_epoch); auto microseconds = std::chrono::duratioin_cast<std::chrono::microseconds>(time_since_epoch); std::cout << "Seconds since epoch: "<< seconds.count()<<'\n'; std::cout << "Milliseconds since epoch: "<< milliseconds.count()<<'\n'; std::cout << "Microseconds since epoch: "<< microseconds.count()<<'\n';
7.初始化time_point
默认情况下,time_point 会被初始化为时间纪元(epoch),即0
cppstd::chrono::time_point<std::chrono::system_clock> tp; // 时间点初始化为 epoch
可以通过指定duration初始化
cppauto tp = std::chrono::system_clock::time_point(std::chrono::seconds(10)); // 从 epoch 开始 10 秒
8.自定义时钟
可以结合自定义的时钟和time_point使用。例如,以下代码定义一个以小时为单位的自定义时钟
cpp#include <chrono> #include <iostream> struct CustomClock { using duration = std::chrono::hours; using rep = duration::rep; using period = duration::period; using time_point = std::chrono::time_point<CustomClock>; static time_point now() noexcept { return time_point(duration(42)); // 固定时间点,假设现在是42小时 } }; int main() { auto custom_time = CustomClock::now(); std::cout << "Custom clock time: " << custom_time.time_since_epoch().count() << " hours\n"; return 0; }
c语言获取当前时间(包括年月日) 通过time.h 头文件中的time()和localtime() 函数实现。
cpp
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main() {
// 获取当前时间戳(秒)
time_t t = time(NULL);
// 如果获取时间失败
if (t == -1) {
perror("time");
return 1;
}
// 将时间戳转换为本地时间
struct tm *local_time = localtime(&t);
// 获取年、月、日、时、分、秒
int year = local_time->tm_year + 1900; // tm_year 是从 1900 年开始的
int month = local_time->tm_mon + 1; // tm_mon 是从 0 开始的,0 表示 1 月
int day = local_time->tm_mday; // tm_mday 是从 1 开始的
int hour = local_time->tm_hour;
int minute = local_time->tm_min;
int second = local_time->tm_sec;
// 获取当前时间的微秒数
struct timeval tv;
if (gettimeofday(&tv, NULL) != 0) {
perror("gettimeofday");
return 1;
}
int microsecond = tv.tv_usec; // 微秒
// 打印年月日时分秒和微秒
printf("Current date and time: %d-%02d-%02d %02d:%02d:%02d.%06d\n",
year, month, day, hour, minute, second, microsecond);
return 0;
}
C++ 获取年月日时分秒 和微秒
cpp
#include <iostream>
#include <chrono>
#include <iomanip>
#include <ctime>
int main() {
// 获取当前时间
auto now = std::chrono::system_clock::now();
// 获取当前时间点的秒部分
auto now_seconds = std::chrono::time_point_cast<std::chrono::seconds>(now);
auto duration = now - now_seconds; // 获取微秒部分
auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();
// 将当前时间转换为 system_clock 时间戳
std::time_t now_time_t = std::chrono::system_clock::to_time_t(now_seconds);
// 转换为本地时间
std::tm local_time = *std::localtime(&now_time_t);
// 打印年月日时分秒和微秒
std::cout << "Current date and time: "
<< std::put_time(&local_time, "%Y-%m-%d %H:%M:%S")
<< "." << std::setw(6) << std::setfill('0') << microseconds
<< std::endl;
return 0;
}