[英]Printing time_t in milliseconds
我有一堆以微秒为单位的任务,下面的代码只打印到几秒(2021 年 10 月 21 日星期四 12:48:20),所以比较开始和结束的值总是最终给出 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);
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();
}
我建议完全跳过 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;
#include "date/tz.h"
到 C++20 using namespace date;
.
在任一程序中,您都可以使用以下命令截断到毫秒精度:
const auto p1 = floor<milliseconds>(system_clock::now());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.