我有一堆以微秒为顺序的任务,下面的代码只打印到秒(星期四10月21日12:48:20 2021),所以比较开始和结束的值总是最终给出0。我希望能够以毫秒和微秒的顺序进行比较。有一个功能来帮助这个吗?
还有,是否有办法将uint64_t current1 = std::chrono::system_clock::now().time_since_epoch().count();
转换为time_t
,以基于count()
打印当前时间?
const auto p1 = std::chrono::system_clock::now();
std::time_t now = std::chrono::system_clock::to_time_t(p1);
std::cout << "now: " << std::ctime(&now);
我建议完全跳过C计时API。它容易出错,不能处理亚秒级精度。
如果UTC(相对于本地时间)是可以的,那么有一个仅头文件的c++ 20的开源预览版,可以与c++ 11/14/17一起工作:
#include "date/date.h"
#include <chrono>
#include <iostream>
int
main()
{
using date::operator<<;
const auto p1 = std::chrono::system_clock::now();
std::cout << "now: " << p1 << 'n';
}
输出:
now: 2021-10-21 20:28:15.754423
要将上述程序移植到c++ 20(它已经在最新的Visual Studio中发布),只需删除#include "date/date.h"
和using date::operator<<;
。
如果你需要本地时间,c++ 20也可以提供(在VS中发布),但是c++ 20的开源预览版不再只有头文件。存在一个需要编译的源文件,并且根据您的需要,可能需要下载IANA tz数据库。
#include "date/tz.h"
#include <chrono>
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
const auto p1 = system_clock::now();
std::cout << "now: " << zoned_time{current_zone(), p1} << 'n';
}
输出:
now: 2021-10-21 16:28:15.754423 EDT
以上语法假定为c++ 17。对于c++ 11/14,需要指定zoned_time
的模板参数:zoned_time<system_clock::duration>
.
上面的程序通过去掉#include "date/tz.h"
和using namespace date;
来移植到c++ 20。
在任何程序中,都可以使用以下命令截断到毫秒级精度:
const auto p1 = floor<milliseconds>(system_clock::now());
time_t
通常是指定(整)秒的整数。
您可以通过从now
中减去整秒time_t
来获得毫秒数:
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
p1 - std::chrono::system_clock::from_time_t(now)).count();
或使用operator%
:
auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>p1)
.time_since_epoch() % std::chrono::seconds(1);
std::cout << ms.count();
示例:
#include <chrono>
#include <iostream>
#include <iomanip>
int main() {
using Clock = std::chrono::system_clock;
using Precision = std::chrono::milliseconds;
auto time_point = Clock::now();
// extract std::time_t from time_point
std::time_t t = Clock::to_time_t(time_point);
// output the part supported by std::tm
std::cout << std::put_time(std::localtime(&t), "%FT%T."); // select format here
// get duration since epoch
auto dur = time_point.time_since_epoch();
// extract the sub second part from the duration since epoch
auto ss =
std::chrono::duration_cast<Precision>(dur) % std::chrono::seconds{1};
// output the millisecond part
std::cout << std::setfill('0') << std::setw(3) << ss.count();
}