我有一堆以微秒為單位的任務,下面的代碼只列印到幾秒(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);
uj5u.com熱心網友回復:
我建議完全跳過 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"和移植到 C 20 using namespace date;。
在任一程式中,您都可以使用以下命令截斷到毫秒精度:
const auto p1 = floor<milliseconds>(system_clock::now());
uj5u.com熱心網友回復:
time_t 通常是指定(整)秒的整數。
您可以通過從以下中減去整秒time_t來獲得毫秒數now:
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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/330388.html
